Java 运行中jar包冲突,定位使用哪个jar包
转自:https://www.cnblogs.com/grey-wolf/p/11403444.html
一、前言
jar包冲突分多种,简单理解来说,就是同package且同名的类在多个jar包内出现,如果两个jar包在同一个classloader下,那么最终的结果是,只会加载其中的一个。
有时,这个错误一般在运行时出现,报的错可能是,找不到某方法,或者呢,更隐蔽的,不会报错,但是逻辑不对。
针对运行中的应用,可以考虑使用阿里出品的arthas来处理。
我今天呢,只是简单的找不到方法的情况,所以不需要用到那个。 我这里的场景是,在学习rocketMq的过程中,其依赖的jar包如下:
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.3.0</version>
</dependency>
该jar包间接依赖如下:
上图是截的idea插件,maven helper。但是一开始并没想起来去看这里。
为什么会冲突呢,因为我把测试类写在了一个使用了netty 5 版本的工程里。(为了偷懒。。)
二、解决冲突的方式一
我这里报错如下:
1 Exception in thread "main" java.lang.NoSuchMethodError: io.netty.bootstrap.Bootstrap.channel(Ljava/lang/Class;)Lio/netty/bootstrap/AbstractBootstrap;
2 at org.apache.rocketmq.remoting.netty.NettyRemotingClient.start(NettyRemotingClient.java:165)
3 at org.apache.rocketmq.client.impl.MQClientAPIImpl.start(MQClientAPIImpl.java:225)
4 at org.apache.rocketmq.client.impl.factory.MQClientInstance.start(MQClientInstance.java:234)
5 at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.start(DefaultMQProducerImpl.java:171)
6 at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.start(DefaultMQProducerImpl.java:144)
7 at org.apache.rocketmq.client.producer.DefaultMQProducer.start(DefaultMQProducer.java:172)
8 at rocketmq.TestRocketMq$SyncProducer.main(TestRocketMq.java:21)
上面意思就是,io/netty/bootstrap/AbstractBootstrap 不存在 channel(Ljava/lang/Class;) 这个方法。
我在ide里,打开了netty 5 jar包里的这个类,确实没找到这个方法,估计就是这个原因了。
怎么验证程序加载了这个类呢?直接在启动参数里,加入 -verbose:class ,然后重新启动,过程中会打印出加载的class:
上图可以看到,果然是从5.0版本的netty里加载的。
三、解决jar包冲突的方式2
idea里安装maven helper插件,然后选择pom,下图即可看出冲突的jar包:
但是,说实话,这个一般事先并不会去看,很有可能都是事后出问题才去这里看。
原文地址:https://www.cnblogs.com/ylz8401/p/12574334.html
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Head First设计模式——单例模式
- 【日拱一卒】链表——两个有序的链表合并
- Head First设计模式——命令模式
- Flask表单之WTForms和flask-wtf
- Head First设计模式——适配器和外观模式
- 「2020最新」Spring最易学习教程 4—整合Mybatis 事务控制
- Head First设计模式——模板方法模式
- Head First设计模式——迭代器模式
- PR工具自带的电源网络分析功能靠谱吗?
- flask_admin使用教程
- C#使用FtpWebRequest 基础连接已经关闭:连接被意外关闭(The underlying connection was closed:The connection was closed u
- 自动化运维实践 | Ansible入门
- 通过设置JDK解决存在多个Gradle后台进程的问题
- Head First设计模式——组合模式
- mmap概述