依赖 jar 没有传递,导致找不到类文件而启动失败了

简介: 最近频繁遇到找不到类文件错误。Caused by: java.lang.NoClassDefFoundError:xxx就这个家伙。

前言


最近频繁遇到找不到类文件错误。

Caused by: java.lang.NoClassDefFoundError:xxx

就这个家伙。

但是我本地启动服务是正常的,前前后后经历了

惊讶 -> 疑惑 -> 烦躁 -> 暴躁 -> 心塞 -> 欣喜

在短短的小半天内,感觉心情像过了一个过山车+大摆锤,结束了,脑袋都是晕的。

关键是本地是正常的!

网络异常,图片无法展示
|

现在,请跟随我的视角,来看看这个让人心态差点爆炸的异常吧!


遇到问题

在一顿噼里啪啦之后,代码写完,Junit 测试完毕、接口文档 Upload 到 YApi 完毕。果断发布 dev 环境!

直接进入启动重试!(PS:通过发布平台发布的)

这时候第一反应:本地启动一下试试!

web started successfully

本地正常啊!

肯定是我启动姿势不正确,重新发布一下!

网络异常,图片无法展示
|

实锤了,和启动姿势没关系!


从淡定到暴躁

当然是看启动日志了。

PS: 服务没起来,只能 ssh 到服务器看日志。

Caused by: java.lang.ClassNotFoundException:xxx
Caused by: java.lang.NoClassDefFoundError:xxx

就这俩哥们,类找不到,奇了怪了。

这个类是通过三方 jar 包依赖进来的,我在 IDEA 里面 ⌘ + B 还能进入源码!

这我不禁怀疑是不是因为开发环境使用的 Docker 容器的原因。

发布其他分支,是可以的。

网络异常,图片无法展示
|

莫非就是因为我引入了一个其他小伙伴提供的 jar,导致我现在用不了!

又是一顿调整依赖!

还不行!

难道是我引入的引来版本不对?

从其他项目找一找怎么用的!

依然不行!

难道是他的 jar 包里面又依赖了很多其他的?

试着 exclusion 掉其他依赖!

依然不行!

是我本地 jar 缓存?

删除本地磁盘上的 jar 试试?

😠😠😠!

网络异常,图片无法展示
|


解决方案就在灵光一闪

虽然 dev 用的是容器,咱拉不下来 jar 包。但是我可以本地打个包试试!

clean package

得到一个 jar 包

jar -xvf xxx-web-1.0.0-SNAPSHOT.jar

进到 BOOT-INF/lib 里面

% > ls | grep user

竟然啥也没有!

网络异常,图片无法展示
|

既然是打包没有打进去,那就看一下 mvn 依赖树的问题吧!


解决问题

网络异常,图片无法展示
|

web 启动失败,是因为 service 添加的依赖,没有传递到 web,所以 web 打包没有打进去那个类。

注意,这里可以正常打包,本地环境可以正常启动。

奇怪吧!

现在进入解决方式:

  • 查看 maven 依赖树

进入到 web module,执行以下命令。

mvn dependency:tree>tree.txt

有这么一行错误:

[WARNING] The POM for com.xxx:xxx-xxx-xxx:jar:1.0.1-SNAPSHOT is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details

问题描述的很清晰,依赖传递失败,因为啥依赖传递失败呢?

再开启 debug 打印下错误:

mvn -X dependency:tree>tree.txt
[WARNING] The POM for com.xxx:xxx-xxx-xxx:jar:1.0.1-SNAPSHOT is invalid, transitive dependencies (if any) will not be available: 2 problems were encountered while building the effective model for com.xxx:xxx-xxx-xxx:jar:1.0.1-SNAPSHOT
[ERROR] 'dependencies.dependency.version' for com.alibaba:easyexcel:jar is missing. @ 
[ERROR] 'dependencies.dependency.version' for com.xxx:cache:jar is missing. @ 

说是因为下面两个 jar 的 version 找不到,所以会导致依赖传递失败。

PS: 我所有的依赖版本都是在父 POM 进行维护的,子 module 只有依赖 groupId 和 artifactId。

所以归根到底,是因为父 POM 的版本没有传递下去!

仔细一瞅,发现父 POM 的版本是 1.0.0,各个 module 的 parent 节点的属性也是 1.0.0

之前都是 SNAPSHOT 版本,后来因为公司的 nexus 配置了自动清除长时间不用的 SNAPSHOT 版本的依赖,我就去掉了 SNAPSHOT。

父 POM deploy 到私服的就是一个空的项目,里面就一个 POM 文件。

最后升级了一下父 POM 的版本,重新 deploy 一下,再改改各个 module 的依赖版本。

大功告成!


总结


本文主要是含泪记下一个苦逼的问题排查过程。害,竟然没有第一时间想到原因!

网络异常,图片无法展示
|

下次再遇到记得 mvn -X dependency:tree>tree.txt 看下依赖树!

我的实践已经证明了:重启、清缓存、排除依赖都是没用的!

目录
相关文章
|
3月前
|
Java 中间件 测试技术
java依赖冲突解决问题之jar包版本冲突无法通过升降级解决时如何解决
java依赖冲突解决问题之jar包版本冲突无法通过升降级解决时如何解决
|
3月前
|
Java Linux Maven
java依赖冲突解决问题之容器加载依赖jar包如何解决
java依赖冲突解决问题之容器加载依赖jar包如何解决
|
3月前
|
Java Maven 容器
java依赖冲突解决问题之Maven在编译打包过程中对依赖的jar包如何解决
java依赖冲突解决问题之Maven在编译打包过程中对依赖的jar包如何解决
|
27天前
|
Java Windows
如何在windows上运行jar包/JAR文件 如何在cmd上运行 jar包 保姆级教程 超详细
本文提供了一个详细的教程,解释了如何在Windows操作系统的命令提示符(cmd)中运行JAR文件。
398 1
|
3月前
|
Java 测试技术 Maven
java依赖冲突解决问题之多个版本的jar包中都没有找到缺失的方法如何解决
java依赖冲突解决问题之多个版本的jar包中都没有找到缺失的方法如何解决
|
3月前
|
Java 测试技术 数据库
容器镜像解析问题之解析 Java 应用依赖时识别 jar 包如何解决
容器镜像解析问题之解析 Java 应用依赖时识别 jar 包如何解决
24 0
|
3月前
|
Java Maven Windows
Maven 引用jar包冲突 Intellij 查找排除JAR包的依赖关系(Maven Helper)
Maven 引用jar包冲突 Intellij 查找排除JAR包的依赖关系(Maven Helper)
50 0
|
4月前
|
Java
[JarEditor]可直接修改jar包的IDEA插件
### 修改JAR包变得更简单:JarEditor插件简介 **背景:** 开发中常需修改JAR包中的class文件,传统方法耗时费力。JarEditor插件让你一键编辑JAR包内文件,无需解压。 **插件使用:** 1. **安装:** 在IDEA插件市场搜索JarEditor并安装。 2. **修改class:** 打开JAR文件中的class,直接编辑,保存后一键构建更新JAR。 3. **文件管理:** 右键菜单支持在JAR内新增/删除/重命名文件等操作。 4. **搜索:** 使用内置搜索功能快速定位JAR包内的字符串。
417 2
[JarEditor]可直接修改jar包的IDEA插件
|
4月前
|
弹性计算 Java Serverless
Serverless 应用引擎操作报错合集之上传自定义JAR包,启动时报错,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
4月前
|
关系型数据库 Java 分布式数据库
PolarDB产品使用问题之部署到服务器上的Java应用(以jar包形式运行)无法连接,如何解决
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。