目录 start

  1. 类加载导致的迷惑
    1. 主题
    2. 解决方案
    3. 场景

目录 end|2020-04-29 11:57|


类加载导致的迷惑

记录一次因Jar包冲突导致的类加载问题

参考: 为什么SpringBoot的 jar 可以直接运行?
参考: 重新看待Jar包冲突问题及解决方案
参考: jar包冲突与inode

Maven: Introduction to the Dependency Mechanism

主题

  1. Java 类加载
  2. Linux inode
  3. Jenkins Maven package

解决方案

  1. 借助 Maven Helper 插件尽量避免Maven中依赖的冲突 maven-enforcer-plugin 插件 配合extra-enforcer-rules工具
  2. 或者 使用脚本等工具分析出 不同jar包里 限定名一致的类

场景

  1. SpringBoot项目 本身已经依赖了servlet3.1 因二方依赖被动引入了 servlet 2.5 版本
  2. 上线途中项目启动失败,抛出 NoSuchMethodError 可知加载了低版本的 servlet
  3. 经过分析可知依赖冲突导致,但是测试在未经排除依赖冲突时又做了重新上线,项目竟正常启动,因此分析底层原因

项目依赖 mvn dependency:tree -Dverbose -Dincludes=javax.servlet:

1
2
3
4
5
6
7
8
[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🫙3.1.0:compile
[INFO] \- com.xxx2🫙2.1.3-RELEASE:compile
[INFO]    \- com.xxx3:xx-api:jar:1.3:compile
[INFO]       \- javax.servlet:servlet-api:jar:2.5:compile