说明: 该博文基于springboot 2.4.2版本测试。
1.普通的打包方式
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
注意:如果 maven-compiler-plugin 识别不到版本号,需要手动加 version
通过maven 的 package 打包后,target目录下会生成如下jar包。
解压后得到如下目录
打开 BOOT-INF,会 lib下有程序所需的,很多的依赖jar。
普通的打包方式直接将包丢到服务器,运行 nohup java -jar xxx.jar & ,程序也就正常跑起来了。但是这样打出来的jar包,体积非常大,运维可能略受影响。
2.优化后的打包方式
说明:实际上就是将lib抽取出来,放到指定目录下,后续业务jar启动时,去指定新lib所在的目录。
- 首先我们需要将未瘦身前的jar包中的 lib复制出来,放到指定目录下。
注意:最好将<includes>标签下有的jar给删除,如果不是该层级结构的项目就忽略。例如我的目录层级,是有一个api模块来存储实体参数的,这种随时可能会更新。(lib包的jar一般是较少变动的第三方包)
这种做法有个缺点,就是后续如果有新的第三方依赖包,也需要手动加该lib目录下。
- 随后我们就可以开始修改pom文件了
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<configuration>
<!--启动类-->
<mainClass>com.tz4cloud.xxx.xxxxApplication</mainClass>
<layout>ZIP</layout>
<includes>
<include>
<!--nothing配置说明打包后不希望lib目录中有任何jar包-->
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
实际场景中,我们的业务模块一般还有个 api层,如果是这种目录层级的项目,需要将api也打进lib中。方式如下,只需在 <includes> 标签中,将api引入。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<configuration>
<mainClass>com.tz4cloud.xxx.xxxxApplication</mainClass>
<layout>ZIP</layout>
<includes>
<!--期望将api打包进lib-->
<include>
<groupId>com.tz4cloud</groupId>
<artifactId>tz-common-log</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
配置后我们再打包看看,会发现lib下已经没有多余的包了。成功完成了瘦身
接下来只要在启动命令指定新lib所在的目录就可以啦
java -Dloader.path=/usr/local/services/tz4cloud/lib -jar ./xxxxx-0.0.1-SNAPSHOT.jar
其他:
测试时可以用下面的配置,将lib包打到target目录下,方便我们提取
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeGroupIds>
#这里是包路径,自己调整
com.sztz
</excludeGroupIds>
</configuration>
</execution>
</executions>
</plugin>
3.遇到的问题
本人在对gateway进行瘦身时,导致了所有项目都无法正常启动,错误如下。
提示也很明显,说的是 gateway中有依赖和 springmvc 的依赖冲突了,要求我删除 springmvc依赖。
解决方式一:
gateway启动脚本,在指定 -Dloader.path
时,配置自己的lib位置,不与其他共用。
解决方式二:
干脆gateway就不瘦身了。。
如上即可,还得注意别把gateway lib中的包放到共用的lib下哈