Java ClassLoad Confuse - Kuangcp/Note GitHub Wiki
目录 start
目录 end|2020-04-29 11:57|
记录一次因Jar包冲突导致的类加载问题
参考: 为什么SpringBoot的 jar 可以直接运行?
参考: 重新看待Jar包冲突问题及解决方案
参考: jar包冲突与inode
- Java 类加载
- Linux inode
- Jenkins Maven package
- 借助 Maven Helper 插件尽量避免Maven中依赖的冲突 maven-enforcer-plugin 插件 配合extra-enforcer-rules工具
- 或者 使用脚本等工具分析出 不同jar包里 限定名一致的类
- SpringBoot项目 本身已经依赖了servlet3.1 因二方依赖被动引入了 servlet 2.5 版本
- 上线途中项目启动失败,抛出 NoSuchMethodError 可知加载了低版本的 servlet
- 经过分析可知依赖冲突导致,但是测试在未经排除依赖冲突时又做了重新上线,项目竟正常启动,因此分析底层原因
项目依赖
mvn dependency:tree -Dverbose -Dincludes=javax.servlet:
[INFO] --- maven-dependency-plugin:3.0.2:tree (default-cli) @ project---
[INFO] Verbose not supported since maven-dependency-plugin 3.0
[INFO] com.project:war:1.0.0-SNAPSHOT
[INFO] +- com.xuxueli:xxl-job-core:jar:1.9.0:compile
[INFO] | \- javax.servlet:javax.servlet-api:jar:3.1.0:compile
[INFO] \- com.xxx2:jar:2.1.3-RELEASE:compile
[INFO] \- com.xxx3:xx-api:jar:1.3:compile
[INFO] \- javax.servlet:servlet-api:jar:2.5:compile