Jar包冲突的相关文章:

了不得,我可能发现了Jar 包冲突的秘密

 

一、前言

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 版本的工程里。(为了偷懒。。)

二、解决冲突的方式一

我这里报错如下:

 Exception in thread "main" java.lang.NoSuchMethodError: io.netty.bootstrap.Bootstrap.channel(Ljava/lang/Class;)Lio/netty/bootstrap/AbstractBootstrap;
at org.apache.rocketmq.remoting.netty.NettyRemotingClient.start(NettyRemotingClient.java:165)
at org.apache.rocketmq.client.impl.MQClientAPIImpl.start(MQClientAPIImpl.java:225)
at org.apache.rocketmq.client.impl.factory.MQClientInstance.start(MQClientInstance.java:234)
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.start(DefaultMQProducerImpl.java:171)
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.start(DefaultMQProducerImpl.java:144)
at org.apache.rocketmq.client.producer.DefaultMQProducer.start(DefaultMQProducer.java:172)
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包:

但是,说实话,这个一般事先并不会去看,很有可能都是事后出问题才去这里看。

四、总结

今天这个场景很简单,文章开头那个链接里的案例要复杂一点(windows上可以,linux不行)。大家也可以看下。

jar包为什么冲突?这里再理解下,因为在jvm里,一个类是唯一的,说明类加载器相同 + 类的全路径名相同。

如果同一个类加载器下出现了两个全路径相同的类,自然就冲突了。

曹工杂谈:一例简单的Jar包冲突解决示例的更多相关文章

  1. Android 第三方库导致jar包冲突解决办法

    这几天的任务是将mapbox的工程合到程序中去,但是合并过程却出现了问题 合并方法: 在app的build.gradle中添加 dependencies { compile ('com.mapbox. ...

  2. xml-apis.jar getTextContent() jar包冲突解决(getTextContent()方法无法找到)

    1.引用包: import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList; 2.方法中应用: ...

  3. jar包冲突解决

    背景: 新需求需要引入新jar包,引入后发现本地启动没有报错,发到测试环境提示某个bean无法创建,nested exception is java.lang.VerifyError: Bad typ ...

  4. tomcat web工程 jar包冲突解决方法

    目前在部署工程时,遇到了一个问题,报错信息如下: See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet ...

  5. jar包冲突解决方法

    import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.Enumerati ...

  6. 【BUG】websphere找不到类或jar包冲突

    来自:http://liuwei1578.blog.163.com/blog/static/49580364200991572642653/ Jar包冲突问题是在大型Java软件开发中经常遇到的问题, ...

  7. idea升级maven工程jar包版本和解决jar包冲突

    原来用过eclipse的都知道,想要升级maven工程的jar包版本或者解决jar包冲突,直接在pom文件下的dependency hierarchy视图下右击冲突的jar包,将其exclude掉,然 ...

  8. 【曹工杂谈】Maven源码调试工程搭建

    Maven源码调试工程搭建 思路 我们前面的文章<[曹工杂谈]Maven和Tomcat能有啥联系呢,都穿打补丁的衣服吗>分析了Maven大体的执行阶段,主要包括三个阶段: 启动类阶段,负责 ...

  9. 【曹工杂谈】Mysql-Connector-Java时区问题的一点理解--写入数据库的时间总是晚13小时问题

    背景 去年写了一篇"[曹工杂谈]Mysql客户端上,时间为啥和本地差了整整13个小时,就离谱",结果最近还真就用上了. 不是我用上,是组内一位同事,他也是这样:有个服务往数据库in ...

随机推荐

  1. javascript案例之放大镜效果

    效果图 如何实现该效果呢??   我们先来进行分析 实现思路 1.鼠标移入移出事件 1>移入:悬浮块和大图显示 2>移出:悬浮块和大图隐藏 2.鼠标移动(悬浮块随着鼠标移动) 1>获 ...

  2. 能访问的谷歌 http://209.116.186.231/

    能访问的谷歌 http://209.116.186.231/

  3. Spring_IoC注解开发和AOP的XML开发(学习笔记2)

    一:IoC注解开发 1,在applicationContext.xml中需要引入context约束 <beans xmlns="http://www.springframework.o ...

  4. c语言进阶2-变量的作用域与无参函数

    一.       什么是函数 函数是具有特定功能的模块.可以说一个完整的程序其实是由多个函数共同完成的.C语言的全部工作都是由程式各样的函数完成的,所以也把C语言称为函数式语言.使用模块化设计可能 使 ...

  5. mysql8.0.15创建数据库和是删除数据库及删除用户

    ---恢复内容开始--- 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons) 1.首先安装mysql8.0.15 2.Mys ...

  6. burpsuit用法

    1. 学习Proxy首先看标红,intercept is on 为拦截状态  其对应的intercept is off 为非拦截状态,设置完代理后打开拦截状态 ,浏览器发起的请求会被burpsuite ...

  7. 「玩转Python」打造十万博文爬虫篇

    前言 这里以爬取博客园文章为例,仅供学习参考,某些AD满天飞的网站太浪费爬虫的感情了. 爬取 使用 BeautifulSoup 获取博文 通过 html2text 将 Html 转 Markdown ...

  8. 移动端开发用touch事件还是click事件

    前端开发现在包含了跨浏览器,跨平台(不同操作系统)和跨设备(不同尺寸的设备)开发. 在移动开发的过程中,到底选取touch事件还是click事件?对了,请不要鄙视click,click在移动端开发用着 ...

  9. DotSpatial安装、类库引用方法

    解决VS工具栏添加DotSpatial后,控件不全问题. 注意注意注意:不要使用Nuget安装DotSpatial!!! 我在Nuget上把所有DotSpatial的版本都安装了一遍,都缺少控件,然后 ...

  10. 前端工程师和设计师必备的chrome插件

    Google Chrome是最好用的几个浏览器之一,今天我来分享下自己收集的一系列Chrome插件,希望对大家的学习和工作有帮助. 注:你可以通过复制链接或者在谷歌商店搜索相应插件的名称来获取以下插件 ...