介绍
随着技术的迭代,在我们日常的开发中现在普遍都是使用SpringBoot
进行开发了,在使用maven
构建的传统web应用
时,我们都是将项目打包成war
包,放在tomcat中部署,各个目录资源都是分离开的,对于配置文件的修改非常方便。但是使用SpringBoot
的打包工具的话,默认是打包成一个jar
文件,通过java命令
就能直接运行,项目会运行在SpringBoot
内嵌的web服务器中,我们可以对这两种打包方式做一个横向的对比:
war包 | jar包 | |
---|---|---|
部署方式 | 需要放在外部的web容器中才能运行 | 可以直接使用java命令运行,程序将运行在内嵌的web容器 |
文件构成 | 各资源文件分离,如lib、classes、配置文件等,修改和替换文件方便 | 所有的资源文件都打包在一起,修改跟替换文件很麻烦 |
也正是因为jar包的打包方式将所有的资源都打包在一起,所以jar包的体积会比较大
。动辄上百兆的jar包在服务器上进行部署的时候是非常麻烦的,可能代码只占了20%的大小,依赖的jar包占了70%的大小,但是对于只是代码上小小的改动,也需要整个项目重新打包部署,同时对于一些配置文件的修改也并不是很方便。
修改前
只有一个jar包,大小是53.5MB
修改后
可以看到将依赖分离后,jar包的体积明显的减小了,而且我们还可以将配置文件单独分离出来,方便我们以后的修改。
配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yousan</groupId>
<artifactId>springboot-maven-package</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-maven-package</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<!-- 打包后导出的路径 -->
<package.path>${project.build.directory}/app</package.path>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
......
</dependencies>
<build>
<plugins>
<!-- 上线部署 JAR启动分离依赖lib和配置 -->
<!-- 打包jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<!-- 不打包资源文件 -->
<excludes>
<exclude>*.**</exclude>
</excludes>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!-- MANIFEST.MF 中 Class-Path 加入前缀 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- jar包不包含唯一版本标识 -->
<useUniqueVersions>false</useUniqueVersions>
<!-- 指定入口类 -->
<mainClass>com.yousan.SpringbootMavenPackageApplication</mainClass>
</manifest>
<!-- 指定配置文件目录,这样jar运行时会去找到同目录下的config文件夹下查找 -->
<manifestEntries>
<Class-Path>config/</Class-Path>
</manifestEntries>
</archive>
<outputDirectory>${package.path}</outputDirectory>
</configuration>
</plugin>
<!-- 拷贝依赖 copy-dependencies -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory> ${package.path}/lib/ </outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<!-- 拷贝资源文件 copy-resources -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- 指定参与构建的resource -->
<includes>
<include>*.**</include>
</includes>
</resource>
</resources>
<outputDirectory>${package.path}/config</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>