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包:

 

但是,說實話,這個一般事先並不會去看,很有可能都是事后出問題才去這里看。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM