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包瘦身的详细内容。
   
 
   