.jar中没有主清单属性_springboot 打包插件去除jar包瘦身

1、pom文件配置

1.1 添加maven-dependency-plugin插件用于将引用的jar包拷贝到指定的路径,便于后续tomcat启动指定依赖包路径


<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-dependency-pluginartifactId>
<executions>
<execution>
<id>copyid>
<phase>packagephase>
<goals>
<goal>copy-dependenciesgoal>
goals>
<configuration>

<outputDirectory>
${project.build.directory}/lib
outputDirectory>
configuration>
execution>
executions>
plugin>

使用这个插件构建完之后的目录结构多了一个lib目录(即上述配置的outputDirectory指定的路径),里面是依赖的jar包:

70f83111f0529cd38351ce6354370a82.png

b056690399a0b8b5b736cf4e3649b67f.png

1.2 springboot项目使用spring-boot-maven-plugin打包插件

<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<executable>trueexecutable>
     <layout>ZIPlayout>
<mainClass>
com.iasp.BasicStartermainClass>

<includes>
<include>
<groupId>${groupId}groupId>
<artifactId>${artifactId}artifactId>
include>
    
   

includes>






configuration>

<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
execution>
executions>
plugin>

配置上述打包之后就会排除相应的jar包,使得由插件打成的Flat jar包大小变小,便于上传服务器发布,效果如下,BOOT-INF目录下的lib目录没有了:

68c896f74d5f84fdea9b8ca940bffb10.png

原先打成的jar包里的结构为

49f50475ca9be491ac196c5499c7144e.png

然后在启动项目时指定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插件,配置属性,另外在处理一些读取可执行jar中的文件时,可以使用maven-jar-plugin插件替换spring-boot-maven-plugin进行打包操作

<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-jar-pluginartifactId>
<configuration>
<archive>
<manifest>

<addClasspath>trueaddClasspath>

<classpathPrefix>lib/classpathPrefix>
<mainClass>com.common.util.CommonUtilsApplicationmainClass>
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来启动

7aba9287db58b0858688f1ced045d6b6.png

如下:在同一级目录启动

3098561d71e04749b3bb37e9bc7ad942.png

不在同一级目录启动:

16f71216b3c70a17a74fd02ed3022e3b.png

其中-Dloader.path可以指定多个目录,这样在存在多个微服务情况下可将一些公共用到的jar放在一个共享目录中,每个微服务独有的jar可以放在微服务私有的目录下(解决jar版本冲突问题),示例如下:

0de168ba4a40c2e6478d3fc7fd4de031.png

注意:

1、使用-Dloader.path需要在打包的时候增加ZIP,不指定的话-Dloader.path不生效。对于多个微服务瘦身打包建议使用maven-jar-plugin打包,避免因为spring-boot-maven-plugin打包机制导致的一些应用启动问题(已踩坑)

2、若存在不同版本依赖:比如项目A依赖Y库的1.0版本,项目B依赖Y库的2.0版本,那么可能会出现版本依赖冲突(两个版本不兼容的情况下),解决方案:

  2.1、能做到版本一致就保持使用同一个版本,保证版本一致。可以使用maven的版本依赖管理进行处理,即在父pom文件使用统一管理依赖版本

  2.2、让项目各自依赖所需的版本并打进war包中,把其他同版本的jar包放在同一个共享包下

测试发现依赖在查找时从上往下找,匹配到就用第一个,如下图会使用comm-0.0.1.jar版本的

8b5a1ef2bea44385da1c4734b2a5f126.png

附注:

使用spring-boot-maven-plugin插件,会将依赖的jar包全部打包进去,这样就可以直接运行生成的 JAR 包,简化了我们开发操作。

使用spring-boot-maven-plugin插件如果不指定程序主运行入口类的话默认为Main-Class: org.springframework.boot.loader.JarLauncher

8f14655f249421680e3581190b98e5d1.png

这个可以自定义执行主入口类,有以下几种方式:

1.POM继承spring-boot-starter-parent

<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.9.RELEASEversion>
<relativePath/>
parent>
<properties>

<start-class>ccom.notes.JavaNotesApplicationstart-class>
properties>

2.POM不是继承spring-boot-starter-parent时需指定

<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>2.1.9.RELEASEversion>
<configuration>
<mainClass>com.notes.JavaNotesApplicationmainClass>
<layout>ZIPlayout>
configuration>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
execution>
executions>
plugin>

3.POM不是继承spring-boot-starter-paren,且使用maven-jar-plugin插件来指定执行的类

<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-jar-pluginartifactId>
<configuration>
<archive>
<manifest>
<addClasspath>trueaddClasspath>
<useUniqueVersions>falseuseUniqueVersions>
<classpathPrefix>lib/classpathPrefix>
<mainClass>com.notes.JavaNotesApplicationmainClass>
manifest>
<manifestEntries>
<version>${project.version}version>
manifestEntries>
archive>
configuration>
plugin>

 文章来源:https://my.oschina.net/u/4344754/blog/3411168

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值