項目 Git 更新後啟動報 IncompatibleClassChangeError: Implementing class,經歷 Maven 清理、重新打包、刪倉庫、重新 Clone 等常規操作均無效。最終通過分層排查法定位為 Tomcat 容器層面問題。
mvn install -Dmaven.test.skip=true 打包成功 → Maven/IDEA 正常startup.bat 部署同一 WAR 復現錯誤 → Tomcat 環境有問題信息: validateJarFile(F:\...\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
嚴重: Exception invoking method manageApp
java.lang.IncompatibleClassChangeError: Implementing class
at java.lang.ClassLoader.defineClass1(Native Method)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2775)
at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:1945)
...
WEB-INF/lib 下包含 servlet-api-2.5.jarlib 目錄下已有 servlet-api.jar(容器提供)IncompatibleClassChangeErrorvalidateJarFile 發現 WebApp 包含 Servlet Spec 類,拒絕加載並報警<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope> <!-- 編譯時用,打包不進 WAR -->
</dependency>
WEB-INF/lib/servlet-api-*.jarBootstrap ClassLoader (JRE rt.jar)
↑
System ClassLoader (classpath)
↑
Common ClassLoader (tomcat/lib/*.jar) ← 容器共享類,如 servlet-api.jar
↑
WebApp ClassLoader (WEB-INF/lib/*.jar, WEB-INF/classes) ← 應用私有類
mvn dependency:tree 定期檢查傳遞性依賴帶入的衝突 JARmvn clean + 重啟 Tomcat 必不可少ContextConfig.checkHandlesTypes 提示 Servlet 註解掃描階段出錯本質是同一類被不同類加載器加載導致類身份不一致。Maven provided 作用域是標準解法,容器層面衝突需清理 tomcat/lib 或重裝 Tomcat。排查思路比結論更寶貴:構建產物驗證 → 環境隔離驗證 → 定位層級 → 精準修復。