【踩坑】 Maven中依赖的隐式冲突 可能导致的 NoClassDefFoundError NoSuchMethodException 等问题

参考: 重新看待Jar包冲突问题及解决方案
参考: Maven依赖冲突的产生原因和解决方式

通过以上文章, 大致能理解和解决Maven依赖冲突的问题, 但是这里存在一个隐式的问题, 而且问题还依据不同的平台可能还有不同的表现

Github: 问题代码示例

例如示例中的类 SimpleTransformer 如果直接运行就会抛异常 ExceptionInInitializerError 在多线程环境里, 会引发接下来的引用该类的客户端代码抛异常 ClassNoDefFoundError

由于日志平台最近有点问题, 导致了第一个异常被掩盖住了, 看到的只有 ClassNoDefFoundError , 一眼看过去并没有看到问题, 而且使用 Maven Helper 插件查看依赖冲突也没发现问题, 直到在依赖树中搜索 asm 发现有两个 asm 版本依赖共存

因为 两个 asm 依赖的 groupId 不一致, 虽然当中的类的结构大多一致, 包名一致 此时就有可能导致运行时错误

	<dependency>
      <groupId>asm</groupId>
      <artifactId>asm</artifactId>
      <version>3.3.1</version>
    </dependency>
    
    <dependency>
      <groupId>org.ow2.asm</groupId>
      <artifactId>asm</artifactId>
      <version>5.1</version>
    </dependency>

以上示例中报错的根源是 org.objectweb.asm.ClassVisitor 类在 3.1 版本中是一个接口, 而到了 5.1 已经变成了抽象类, 于是两个依赖都被package了, 如果是war包这样的依赖, 还会进行解压, 此时又涉及类加载器的规则, 在不同的平台上可能有不同的表现, 也就有了更坑的可能性

还有此类问题还有 commons-io netty 等三方库, 都有变更 groupId 和 artifactId 的历史, 神坑…

此外 如果项目是Maven多模块的项目,例如分为 web service 等模块,如果子模块之间出现了一些 限定名一致的类也会引发该问题,但是同样的在IDEA中能正确编译和运行,当打包后才会暴露问题

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值