java.lang.IncompatibleClassChangeError: Implementing class,用常見的解決問題的方法解決不常見的問題 ...
一,問題產生背景
git更新代碼重啟伺服器後,問題就莫名奇妙的產生了,一看報錯信息,基本看不懂,然後上百度去查,基本都是說jar包衝突,於是把矛頭指向maven
二,問題的解決過程
既然確定了是maven的問題,,按照一貫的手法,clean-->package,試了n多次包括刪repository,刪項目重新git下載等等能幹的全都幹了,結果每次啟動伺服器時,原來非常陌生的報錯信息現在又熟悉的出現在你眼前,那種想砸電腦的心情只有你自己能體會,
後來,我決定擴大問題產生的原因的範圍,一步一步縮小範圍排除,產生這種錯誤的原因無非就三種:idea有問題,maven有問題,tomcat有問題.接下來走上了測試的道路
1.測試maven和idea
脫離idea環境用原生態命令行寫maven命令:mvn install -Dmaven.test.skip=true -Dmaven.development=true;測試打包會不會報錯,結果如下:
顯然測試成功,這一步可以肯定的是,單純的用maven打包和用idea集成maven打包效果是一樣的,由此可以判斷用idea配置的maven很正常,一切都正常.
接下來就要測試maven打的war包有沒有問題,把自己打的war包扔到別人電腦去測試,沒問題,成功運行,證明瞭maven沒問題,證明瞭war包沒問題,證明瞭之前的想法是錯的.
2.測試tomcat和idea
跟之前一樣,先脫離idea環境測試tomcat,刪掉work目錄,刪除掉webapp下的工程,將之前打的war包放到webapp下,然後找到bin目錄下的startup.bat,點擊運行,這時你會發現熟悉的錯誤又出現在你的面前,沒關係,很快你就看不到了,顯而易見,是你的tomcat出問題了.下麵是異常信息:
十二月 17, 2016 10:13:31 上午 org.apache.catalina.loader.WebappClassLoader validateJarFile 信息: validateJarFile(F:\eclipseworkspace\pop-auction-center-law_new\pop-auction-center-web\target\pop-auction-center-web\WEB-INF\lib\servlet-api-2.5.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class 十二月 17, 2016 10:13:40 上午 org.apache.catalina.startup.HostConfig deployDirectory 信息: Deploying web application directory manager 十二月 17, 2016 10:13:46 上午 org.apache.tomcat.util.modeler.BaseModelMBean invoke 嚴重: Exception invoking method manageApp java.lang.IncompatibleClassChangeError: Implementing class at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:800) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2775) at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1115) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1610) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1488) at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:1945) at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1908) at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1795) at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1754) at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1740) at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1245) at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:874) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:317) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4881) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:812) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:787) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:583) at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1379) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)於是重新安裝tomcat測試,果不其然,成功跑起來了,通過這次解決問題的過程讓我明白了,陌生的問題並不是阻礙你繼續前行的絆腳石,重要的是你是如何分析問題解決問題的,這一點很重要.