重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要介绍“Spring Boot项目部署到Linux服务器运行报错怎么解决”,在日常操作中,相信很多人在Spring Boot项目部署到Linux服务器运行报错怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring Boot项目部署到Linux服务器运行报错怎么解决”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
成都创新互联主要从事成都网站设计、做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务藁城,10余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792
最近在用 Springboot 开发项目 A,引了小伙伴开发的模块 B,本地起服务,运行的好好的,等部署到服务器上,一运行就报错:Caused by: java.lang.ClassNotFoundException。
注:导致该错误的原因有很多,比如:包冲突、类冲突、包不存在等,我这里只列举其中一种情况,毕竟坑了我半天的时间,我觉得有必要分享出来。
先看一个诡异的现象吧,我用别的工程 C 引用了同样的依赖 B,部署到服务器上,运行的好好的,就我这个工程不行?细看:
1)工程 C 部署到服务器上,/app/C-service/lib 下的 jar包是:
B-api-1.0.0-20191224.024308-5.jar B-dao-1.0.0-20191223.073120-2.jar
2)工程 C 部署到服务器上,/app/C-service/C-service.jar/META-INF/MANIFEST.MF,扫描路径是:
lib/B-api-1.0.0-20191224.024308-5.jar lib/B-dao-1.0.0-20191223.073120-2.jar
而:
1)我的工程 A 部署到服务器上,/app/A-service/lib 下的 jar包是:
B-api-1.0.0-SNAPSHOT.jar B-dao-1.0.0-SNAPSHOT.jar
2)我的工程 A 部署到服务器上,/app/A-service/A-service.jar/META-INF/MANIFEST.MF,扫描路径是:
lib/B-api-1.0.0-20191224.024308-5.jar lib/B-dao-1.0.0-20191223.073120-2.jar
发现:MANIFEST.MF 中扫描的 jar 包路径和实际解压出来的 jar 包名称不一致(一个带时间戳,一个是 SNAPSHOT),所以扫描不到 jar 包,导致报错:Caused by: java.lang.ClassNotFoundException。
那么是什么原因构成了这桩惨案呢?机缘巧合:
1.我小伙伴的模块,deploy 时用的是 SNAPSHOT,如 1.0.0-SNAPSHOT,我在拉取 jar包时,拉到的是:B-api-1.0.0-20191224.024308-5.jar:
com.xxx.xxx B-api 1.0.0-SNAPSHOT
2.我的工程 A 本地可以跑,是因为那时候我没有打包 mvn clean package -Dmaven.test.skip=true,IDEA 本地运行项目时 jar 包扫描路径 和 实际拉取的 jar 包一致;当我打包后,解压出 A-service.zip 包,本地运行同样会报错;
3.问题在于工程 A 打包前后的区别,为什么打包后:MANIFEST.MF 和 A-service.zip 解压后的 lib/ 目录下的 jar包 名称不一致?
4.最后通过比较工程 C 的配置文件和 A 的配置文件,找到不同点:A工程的 assembly.xml 中多了一行:
${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension} false lib
5.把这行去掉,问题确实解决了。但是为什么呢?拉下来的 jar 包、MANIFEST.MF 中扫描的 jar包带时间戳,总觉得不够清秀、哪里不对劲。随后我以 outputFileNameMapping 为字眼找了下相关资料,果然找到了另外一位老大哥:
org.apache.maven.plugins maven-jar-plugin 2.4 true lib/ ${main.class} false *.yml *.properties
6.解释:
1)
2)
刚好:
1)工程 C 中 outputFileNameMapping,useUniqueVersions 都没配置,使用默认值,使得 lib/ 下的 jar包名称 和 MANIFEST.MF 下的扫描路径 jar包名称一致(都带时间戳);
2)而我的工程 A,不只从哪里拷贝来的配置文件,配了 outputFileNameMapping (没带时间戳),但没配置 useUniqueVersions(带时间戳),导致不一致;
所以:这两个配置,要么都有,要么都没有,不然就会出现不一致,导致报错。
我个人觉得,jar 包名称还是不带时间戳更清秀些,所以我推荐 outputFileNameMapping,useUniqueVersions 都配置上,如下:
1.assembly.xml 中添加配置:
${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension} false lib
2.启动类 Application.java 所在模块的 pom.xml 中添加配置:
org.apache.maven.plugins maven-jar-plugin 2.4 true lib/ ${main.class} false *.yml *.properties
到此,关于“Spring Boot项目部署到Linux服务器运行报错怎么解决”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!