SpringBoot+Maven打可运行的JAR包(将lib包单独放在jar外面)

最近在学习使用SpringBoot+Docker,租用的腾讯云服务器环境已经弄好了,就差把项目打好后的jar包放上去,然后生成镜像了,无奈使用mvn package打出来的jar运行时出现了2个问题:

1、no main manifest attribute(找不到程序入口,即未指定main方法所在类)

2、找不到运行依赖的jar包,如SpringBoot启动使用的SpringApplication类

查阅资料并自己试验之后,得出解决以上2个问题的一个综合方案。

 

第一步,在pom.xml中添加插件maven-jar-plugin,并配置入口程序的地址

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <!-- 添加依赖jar路径 -->
        <addClasspath>true</addClasspath>
        <!-- 入口程序 -->
        <mainClass>com.eya.SpringBootStarter</mainClass>
        <classpathPrefix>lib/</classpathPrefix>
      </manifest>
    </archive>
  </configuration>
</plugin>

第二步,使用以下maven命令打包。

mvn clean dependency:copy-dependencies  -DoutputDirectory=target/lib package

说明一下,这里的dependency:copy-dependencies  -DoutputDirectory=target/lib是将程序依赖的jar包拷贝到target/lib目录里去,这也是解决问题的关键步骤。

打包之后,target中的内容如下图

281742ebec0a90ceb290f7f07318b68b3cb.jpg

关键的就是这里多了一个lib包,里面放的是springboot-swagger.jar运行所需要依赖的jar包。为什么lib包一定要放在这里才行?我们可以使用压缩工具打开springboot-swagger.jar,查看META-INF目录下的MANIFEST.MF文件内容(如下图所示),依赖的jar包都是放在了classpath/lib包下,这和maven-jar-plugin中的配置(classpathPrefix)是对应起来的。

49753cf172e4551cac4921bdc165bbb31b2.jpg

进入target目录,使用java -jar springboot-swagger.jar启动springboot应用即可。

13363cf95884aec770675c01ac6201f90eb.jpg

浏览器访问一下试试是否真的启动成功:

b9c4c2921d22801f7611321cae2d9412c2d.jpg

 

写完这篇文章之后,反复思考,觉得不应该这么复杂,后又仔细检查了配置,在我的pom.xml中,spring-boot-maven-plugin插件被放在了pluginManagement标签内,所以没有生效,才引入了问题,去掉pluginManagement之后,直接使用spring-boot-maven-plugin插件打包,就没有博文中提到的各类问题了,也变得很简单了,直接mvn clean package即可打出可运行的jar包。

友情提示:使用博文中提到的方法,可以针对非springboot项目来打可运行的jar包

 

转载于:https://my.oschina.net/simpleton/blog/2249379

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值