2019独角兽企业重金招聘Python工程师标准>>>
最近在学习使用SpringBoot+Docker,租用的腾讯云服务器环境已经弄好了,就差把项目打好后的jar包放上去,然后生成镜像了,无奈使用mvn package打出来的jar运行时出现了2个问题:
1、no main manifest attribute(找不到程序入口,即未指定main方法所在类)
2、找不到运行依赖的jar包,如SpringBoot启动使用的SpringApplication类
查阅资料并自己试验之后,得出解决以上2个问题的一个综合方案。
第一步,在pom.xml中添加插件maven-jar-plugin,并配置入口程序的地址
org.apache.maven.plugins maven-jar-plugin true com.eya.SpringBootStarter lib/
第二步,使用以下maven命令打包。
mvn clean dependency:copy-dependencies -DoutputDirectory=target/lib package
说明一下,这里的dependency:copy-dependencies -DoutputDirectory=target/lib是将程序依赖的jar包拷贝到target/lib目录里去,这也是解决问题的关键步骤。
打包之后,target中的内容如下图
关键的就是这里多了一个lib包,里面放的是springboot-swagger.jar运行所需要依赖的jar包。为什么lib包一定要放在这里才行?我们可以使用压缩工具打开springboot-swagger.jar,查看META-INF目录下的MANIFEST.MF文件内容(如下图所示),依赖的jar包都是放在了classpath/lib包下,这和maven-jar-plugin中的配置(classpathPrefix)是对应起来的。
进入target目录,使用java -jar springboot-swagger.jar启动springboot应用即可。
浏览器访问一下试试是否真的启动成功:
写完这篇文章之后,反复思考,觉得不应该这么复杂,后又仔细检查了配置,在我的pom.xml中,spring-boot-maven-plugin插件被放在了pluginManagement标签内,所以没有生效,才引入了问题,去掉pluginManagement之后,直接使用spring-boot-maven-plugin插件打包,就没有博文中提到的各类问题了,也变得很简单了,直接mvn clean package即可打出可运行的jar包。
友情提示:使用博文中提到的方法,可以针对非springboot项目来打可运行的jar包