1、pom文件配置1.1 添加maven-dependency-plugin插件用于将引用的jar包拷贝到指定的路径便于后续tomcat启动指定依赖包路径
<!--拷贝依赖到jar外面的lib目录--><plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-dependency-plugin</artifactid> <executions> <execution> <id>copy</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <!--指定的依赖路径--> <outputdirectory> ${project.build.directory}/lib </outputdirectory> </configuration> </execution> </executions></plugin>
使用这个插件构建完之后的目录结构多了一个lib目录(即上述配置的outputdirectory指定的路径),里面是依赖的jar包:
1.2 springboot项目使用spring-boot-maven-plugin打包插件<plugin> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-maven-plugin</artifactid> <configuration> <executable>true</executable> <layout>zip</layout> <mainclass> com.iasp.basicstarter </mainclass> <!--只包含自己--> <includes> <include> <groupid>${groupid}</groupid> <artifactid>${artifactid}</artifactid> </include> <!--或者--> <!--依赖jar不打进项目jar包中--> <!--<include> <groupid>nothing</groupid> <artifactid>nothing</artifactid> </include>--> </includes> <!--不包含哪些--> <!--<excludegroupids>--> <!--com.hundsun.jrescloud,--> <!--org.springframework.boot,--> <!--org.springframework--> <!--</excludegroupids>--> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions></plugin>
配置上述打包之后就会排除相应的jar包,使得由插件打成的flat jar包大小变小,便于上传服务器发布,效果如下,boot-inf目录下的lib目录没有了:
原先打成的jar包里的结构为
然后在启动项目时指定jar包路径-dloader.path="../lib",这样就可以达到瘦身效果了,其中依赖放在d:develop/shared/fjar目录下,执行运行命令
java -dloader.path="d:develop/shared/fjar" -jar mytest.jar
附注:另外一种启动方案是可以不加-dloader.path="d:develop/shared/fjar"来指定路径,直接使用如下指令启动
java -jar mytest.jar
使用上述启动的话需要添加maven-jar-plugin插件,配置<classpathprefix>属性,另外在处理一些读取可执行jar中的文件时,可以使用maven-jar-plugin插件替换spring-boot-maven-plugin进行打包操作
<plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-jar-plugin</artifactid> <configuration> <archive> <manifest> <!--addclasspath表示需要加入到类构建路径--> <addclasspath>true</addclasspath> <!--classpathprefix指定生成的manifest文件中class-path依赖lib前面都加上路径,构建出lib/xx.jar--> <classpathprefix>lib/</classpathprefix> <mainclass>com.common.util.commonutilsapplication</mainclass> </manifest> </archive> </configuration></plugin>
上述插件效果就是在打成的包里meta_inf目录下的manifest.mf文件里增加class-path对应jar,这样在后面应用刚启动时就会根据class-path的只去加载需要的版本依赖(解决在共享目录里存在多版本加载引用冲突问题),这个效果就等效加参数-classpath xxx(具体的jar)。
此时就是将需要的jar目录lib放在和要运行的xxx.jar同级目录即可,启动时就可以不加-dloader.path参数了,如果lib目录和要运行的xxx.jar不在同级目录的话,则需要使用-dloader.path来启动
如下:在同一级目录启动
不在同一级目录启动:
其中-dloader.path可以指定多个目录,这样在存在多个微服务情况下可将一些公共用到的jar放在一个共享目录中,每个微服务独有的jar可以放在微服务私有的目录下(解决jar版本冲突问题),示例如下:
注意:
1、使用-dloader.path需要在打包的时候增加<layout>zip</layout>,不指定的话-dloader.path不生效对于多个微服务瘦身打包建议使用maven-jar-plugin打包,避免因为spring-boot-maven-plugin打包机制导致的一些应用启动问题(已踩坑)
2、若存在不同版本依赖:比如项目a依赖y库的1.0版本,项目b依赖y库的2.0版本,那么可能会出现版本依赖冲突(两个版本不兼容的情况下),解决方案:
2.1、能做到版本一致就保持使用同一个版本,保证版本一致。可以使用maven的版本依赖管理进行处理,即在父pom文件使用<dependencymanagement>统一管理依赖版本
2.2、让项目各自依赖所需的版本并打进war包中,把其他同版本的jar包放在同一个共享包下
测试发现依赖在查找时从上往下找,匹配到就用第一个,如下图会使用comm-0.0.1.jar版本的
附注:
使用spring-boot-maven-plugin插件,会将依赖的jar包全部打包进去,这样就可以直接运行生成的 jar 包,简化了我们开发操作。
使用spring-boot-maven-plugin插件如果不指定程序主运行入口类的话默认为main-class: org.springframework.boot.loader.jarlauncher
这个可以自定义执行主入口类,有以下几种方式:1.pom继承spring-boot-starter-parent<parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>2.1.9.release</version> <relativepath/> <!-- lookup parent from repository --> </parent><properties> <!-- the main class to start by executing java -jar --> <start-class>ccom.notes.javanotesapplication</start-class></properties>
2.pom不是继承spring-boot-starter-parent时需指定<plugin> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-maven-plugin</artifactid> <version>2.1.9.release</version> <configuration> <mainclass>com.notes.javanotesapplication</mainclass> <layout>zip</layout> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions></plugin>
3.pom不是继承spring-boot-starter-paren,且使用maven-jar-plugin插件来指定执行的类<plugin> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-maven-plugin</artifactid></plugin><plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-jar-plugin</artifactid> <configuration> <archive> <manifest> <addclasspath>true</addclasspath> <useuniqueversions>false</useuniqueversions> <classpathprefix>lib/</classpathprefix> <mainclass>com.notes.javanotesapplication</mainclass> </manifest> <manifestentries> <version>${project.version}</version> </manifestentries> </archive> </configuration></plugin>
以上就是怎么使用springboot打包插件去除jar包瘦身的详细内容。