SEVERE: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
...
SEVERE: Error configuring application listener of class org.springframework.web.util.Log4jConfigListener
java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener
Spring 相關 JAR 包未正確打包進 WAR 檔案的 WEB-INF/lib 目錄。Tomcat 啟動時找不到 spring-web、spring-context 等核心類別。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.21</version>
<!-- 請勿設定 scope 為 provided 或 test -->
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.21</version>
</dependency>
確保無 <scope>provided</scope>,否則 Maven 不會打包進 WAR。
mvn clean package
# 檢查 target/your-war/WEB-INF/lib/ 是否包含 spring-web-*.jar
jar -tf target/your-war.war | grep spring-web
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<!-- 確保不排除任何依賴 -->
<packagingExcludes>WEB-INF/lib/servlet-api*.jar</packagingExcludes>
</configuration>
</plugin>
| 錯誤模式 | 解決方法 |
|---|---|
| 依賴設為 provided | 移除 scope 或改為 compile |
| 版本衝突導致傳遞性依賴缺失 | 使用 mvn dependency:tree 分析,強制指定版本 |
| 多模組專案父子模組依賴未傳遞 | 子模組明確宣告依賴,或父模組 dependencyManagement |
| Tomcat 部署的是舊版本 WAR | 清理 target、Tomcat webapps、工作目錄後重新部署 |
# 查看完整依賴樹
mvn dependency:tree -Dverbose
# 檢查特定類別來自哪個 JAR
mvn dependency:build-classpath -DincludeScope=compile | tr ':' '\n' | xargs -I {} sh -c 'jar -tf {} | grep ContextLoaderListener && echo {}'
<spring.version>5.3.21</spring.version>mvn dependency:analyze 檢查未使用/未宣告依賴maven-enforcer-plugin 強制依賴收斂ClassNotFoundException 本質是部署產物缺失,系統化檢查打包流程即可根治。