一、项目背景
spring cloud构建spring boot项目,精细化各项目的层次,达到降低耦合度的目的,项目间基于restful通信。
在对项目打包过程中,使用spring-boot-maven-plugin插件打包,生成的是fat jar,解压该jar包,会发现项目依赖的jar包存放于boot-inf下的lib文件夹中,分析多个子项目后会发现,相同的jar包占绝大多数,然后每次部署于线上环境,各系统的共同jar在服务器上其实是重复搁置的,因此自然会想到是否有方法将共同的jar包,或是不经常改动的jar包,抽离出来,整理出单独的一份,然后由各子项目启动时使用外部加载,达到fat jar瘦身的目的。
二、fat jar瘦身
经过以上分析,及查阅相关资料,整理出以下步骤进行jar包瘦身:
1.各项目配置spring-boot-maven-plugin插件(官方文档),生成fat jar中留存的jar包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<plugin> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-maven-plugin</artifactid> <configuration> <layout>zip</layout> <!-- <excludegroupids> org.springframework.boot, org.springframework.cloud, org.mybatis.spring.boot, tk.mybatis, mysql, com.alibaba, javax.persistence, io.springfox, org.springframework.session </excludegroupids> --> <includes> <include> <groupid>xx</groupid> <artifactid>xx</artifactid> </include> <include> <groupid>xx</groupid> <artifactid>xx</artifactid> </include> </includes> </configuration> </plugin> |
如以上代码,可以使用excludegroupids,或者includes,或其他标签,具体看情况。
2.在项目依赖jar中抽离出不想存放于fat jar的jar包。
方法一(推荐):在项目pom文件中添加maven依赖插件(官方文档)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-dependency-plugin</artifactid> <version> 3.1 . 1 </version> <executions> <execution> <id>copy-dependencies</id> <phase> package </phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <!-- <outputdirectory>e:/lib</outputdirectory> --> <excludegroupids> <!-- 留存于fat jar中的jar包的groupid属性值(多个,分隔)--> </excludegroupids> <overwritesnapshots> true </overwritesnapshots> </configuration> </execution> </executions> </plugin> |
标签具体含义查看官方文档。
使用maven对项目进行打包时,使用maven命令:
mvn clean install -dmaven.test.skip=true -doutputdirectory=e:/lib(-doutputdirectory=e:/lib是命令动态指定项目依赖的jar包导出的路径,若在项目中指定了outputdirectory的标签值,则将覆盖此动态路径)
配置插件执行此命令后,项目中除excludegroupids标签中配置的jar包外,其余都将导入到指定目录中,至此完成抽离fat jar中多余的jar包。
方法二:项目中不添加maven依赖插件,直接在对项目使用mvn复制依赖jar包的命令,这种方式需要挨个对各个子项目进行依赖复制,子项目少可以使用。
mvn dependency:copy-dependencies -doutputdirectory=e:/lib(若无动态指定目录,默认在项目的target路径下生成dependency目录)
将各项目导出的依赖jar包,统一放入一个文件夹中,去除重复,并删除fat jar中预留存的依赖jar包,至此完成抽离fat jar中多余的jar包。
3.将抽离出的jar包,放置服务器某一路径下,配置项目启动脚本,进行外部加载。
nohup java -dloader.path="xx/lib" -jar xx.jar
-dloader.path即外部加载地址。
至此瘦身完毕,可以在项目打包后的jar包看到,boot-inf下的lib中,仅有所需的jar包,大大减少了fat jar的大小。
pom的配置可以通用于微服务体系中,形成统一的配置,各个项目中的jar包依赖关系视具体情况更改。
三、遇到的问题及解决办法
在瘦身过程中,并不是一帆风顺的,当我认为大功告成,启动项目时,发现启动失败,jar冲突。
1.解决jar包冲突,通过mvn命令分析jar包的依赖关系,并找到冲突jar包,并统一版本。
在eclipse中,创建新maven build,一开始我尝试了mvn dependency:tree,整体分析一遍jar包依赖,但并没有找到问题jar包的依赖关系,接着我尝试了mvn dependency:tree -dverbose,将所有间接的隐性的依赖也分析了一遍仍未找到问题jar包的依赖关系。
至此,我怀疑项目中没有这个jar包,反复打包后,我看到,此问题jar包的确在项目依赖中,只是隐藏的太深。于是,只能针对单个jar包进行分析:
mvn dependency:tree -dverbose -dincludes=xx:xx:xx(xx:xx:xx对应jar包的groupid:artifactid:version)
使用dincludes后,找到了对应jar包的依赖关系,并在项目中排除了该jar包,再次打包后项目启动成功,问题解决。
2.打包过程中,一些细分的子项目,并未使用spring-boot-maven-plugin插件,而是使用maven-jar-plugin直接打包成一个可运行jar,再结合了fat jar瘦身配置后发现,原本可以依赖互通的jar,现在失效了。由于fat jar瘦身后的lib中,仅剩代码经常改动的项目的jar,依赖关系在可运行jar中,并未传递,因此需要在本项目中显性依赖所需的项目的jar包,才能保证项目的完整。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/tec-dream/p/9149189.html