千家信息网

Spring Boot项目部署到Linux服务器运行报错怎么解决

发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,这篇文章主要介绍"Spring Boot项目部署到Linux服务器运行报错怎么解决",在日常操作中,相信很多人在Spring Boot项目部署到Linux服务器运行报错怎么解决问题上存在疑惑,小编查阅
千家信息网最后更新 2025年11月11日Spring Boot项目部署到Linux服务器运行报错怎么解决

这篇文章主要介绍"Spring Boot项目部署到Linux服务器运行报错怎么解决",在日常操作中,相信很多人在Spring Boot项目部署到Linux服务器运行报错怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Spring Boot项目部署到Linux服务器运行报错怎么解决"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一 背景

最近在用 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.jarB-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.jarlib/B-dao-1.0.0-20191223.073120-2.jar

而:

1)我的工程 A 部署到服务器上,/app/A-service/lib 下的 jar包是:

B-api-1.0.0-SNAPSHOT.jarB-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.jarlib/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}

           ${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}        false        lib    

5.把这行去掉,问题确实解决了。但是为什么呢?拉下来的 jar 包、MANIFEST.MF 中扫描的 jar包带时间戳,总觉得不够清秀、哪里不对劲。随后我以 outputFileNameMapping 为字眼找了下相关资料,果然找到了另外一位老大哥:false ,这行配置是放在工程的 Service 模块(Application.java 启动类所在模块)的 pom.xml 中:

    org.apache.maven.plugins    maven-jar-plugin    2.4                                        true                lib/                ${main.class}                false                                        *.yml            *.properties            

6.解释:

1)${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension},作用是在你打包的时候:lib/ 下的 jar 包可以重命名,比如本来应该是 B-api-1.0.0-20191224.024308-5.jar,通过这行配置后,jar包被重命名为:B-api-1.0.0-SNAPSHOT.jar;

2)false,作用是在你生成 MANIFEST.MF 文件时,lib/ 下的 jar包如果版本是 xxx-SNAPSHOT,要不要带唯一版本时间戳,如果你配置为 false(默认为 true),那么本来应该是 B-api-1.0.0-20191224.024308-5.jar,通过这行配置后,jar包被重命名为:B-api-1.0.0-SNAPSHOT.jar;

刚好:

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}

            ${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}        false        lib    

2.启动类 Application.java 所在模块的 pom.xml 中添加配置:false

    org.apache.maven.plugins    maven-jar-plugin    2.4                                        true                lib/                ${main.class}                false                                        *.yml            *.properties            

到此,关于"Spring Boot项目部署到Linux服务器运行报错怎么解决"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

工程 配置 服务 服务器 运行 时间 项目 一致 名称 模块 路径 文件 学习 原因 问题 清秀 作用 包被 实际 小伙 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库异常会报几开头的状态码 番禺软件开发专业 互通网络技术有限公司 如何关闭腾讯网络安全网址 哪里查土壤修复数据库 吴忠市办公软件开发多少费用 珠海橡胶零件加工管理软件开发 数据怎么备份到服务器 湖北网络安全审计硬件价格怎么样 桌面软件开发用什么技术 安卓小软件开发百度云 关于网络安全英文文献 数据库实体框架 广东crm软件开发商 天龙八部行者无双服务器 美国国立数据库如何搜索指南 小型网吧网络安全解决方案 西安用什么软件开发小的应用程序 大连弘微软件开发公司 apex匹配显示正在启动服务器 人工智能网络技术培训班 南阳招聘软件开发 网络技术与应用怎么考试 江苏制作刀片服务器厂家 网络安全基线怎么检查 工行服务器时间检测工具 关于网络安全法的画 数据库连接池的技术有哪些 长春市大型软件开发有限公司 电脑服务器加固
0