springboot打包插件去除jar包瘦⾝
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>spring怎么读取jar文件
<mainClass>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&s.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&s.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&s.JavaNotesApplication</mainClass>
</manifest>
<manifestEntries>
<version>${project.version}</version>
</manifestEntries>
</archive>
</configuration>
</plugin>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。