引入一個第三方庫作一個功能,依往常同樣,引入對應的pom,對方的包裏是有mina的,因此調用的相應的功能的時候報以下錯誤。
java
Exception in thread "pool-18-thread-1" java.lang.IncompatibleClassChangeError at org.apache.mina.core.filterchain.DefaultIoFilterChain.register(DefaultIoFilterChain.java:267) at org.apache.mina.core.filterchain.DefaultIoFilterChain.addLast(DefaultIoFilterChain.java:174) at org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder.buildFilterChain(DefaultIoFilterChainBuilder.java:436) at org.apache.mina.core.polling.AbstractPollingIoProcessor.addNow(AbstractPollingIoProcessor.java:528) at org.apache.mina.core.polling.AbstractPollingIoProcessor.handleNewSessions(AbstractPollingIoProcessor.java:501) at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$400(AbstractPollingIoProcessor.java:67) at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1116) at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:51) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)
看起來是mina中一個filter鏈在註冊什麼功能時候發生incompatible的錯誤。shell
首先懷疑是這個第三方庫中的mina和我本地服務的mina衝突了,因而我再pom中找到全部的mina依賴 而後依次註釋掉了。可是其實有些pom內部也會依賴的mina的,因而使用mvn的dependency tree命令查看子依賴
apache
mvn dependency:tree >1.txt
而後依次exclusion掉對應的mina依賴。tomcat
<exclusions> <exclusion> <groupId>org.apache.mina</groupId> <artifactId>mina-core</artifactId> </exclusion> </exclusions>
而後啓動,發現仍是報這個問題。而後debug到DefaultIoFilterChain的register方法。發現mina會依次注入logger和protocol。而後對應的報錯是在注入logger的時候報錯的。而後嘗試再依次註釋掉對應的log4j的依賴。不過仍是有這個問題。ui
==========================================================================================debug
其實理論上這個問題通常環境下已經解決ok了。code
我這邊是因爲其它緣由形成的,分析繼續:是否是我本地環境的問題?因而聯繫了中間件的同窗,發現咱們tomcat下有一個基礎服務的sar包,這個sar包因爲版本太低,和mina的服務衝突。因而升級該sar包(該sar包確實有對mina作更改)。問題解決,服務正常調用。中間件
總結一下,這個問題整整坑了我一天,其實只是一個類衝突的問題,最後升級到了環境問題。這裏總結一下,給後來的同窗排坑用。文檔
參考文檔:http://stackoverflow.com/questions/1980452/what-causes-java-lang-incompatibleclasschangeerror get