首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Tomcat 部署 WAR 報 ClassNotFoundException: weka.classifiers.Classifier:缺少依賴 JAR 排查

     編輯:程式設計疑難解答

錯誤堆疊關鍵行

Caused by: java.lang.ClassNotFoundException: weka.classifiers.Classifier
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1892)

直接原因

WAR 包內**缺少 weka.jar**(或包含 weka.classifiers.Classifier 的 JAR),導致 WebappClassLoader 無法載入該類別。應用啟動階段(ServletContextListener、Servlet init、Spring 掃描)嘗試實例化依賴 Weka 的 Bean 時失敗。

排查步驟

  1. 解壓 WAR 檢查:
    # Linux/Mac
    unzip -l your.war | grep weka
    # 或
    jar tf your.war | grep weka
    
    # Windows:將 .war 改為 .zip,用解壓軟體查看 WEB-INF/lib/ 目錄
    
  2. 確認 Maven/Gradle 依賴範圍:
    <!-- 錯誤:provided 不會打包進 WAR -->
    <dependency>
        <groupId>nz.ac.waikato.cms.weka</groupId>
        <artifactId>weka-stable</artifactId>
        <version>3.8.6</version>
        <scope>provided</scope>  <-- 刪除或改為 compile/runtime
    </dependency>
    
    <!-- 正確:compile (預設) 或 runtime -->
    <dependency>
        <groupId>nz.ac.waikato.cms.weka</groupId>
        <artifactId>weka-stable</artifactId>
        <version>3.8.6</version>
    </dependency>
    
  3. 檢查 maven-war-plugin 配置: 是否排除了 WEB-INF/lib/*.jar?是否設定 packagingExcludes?
  4. 多模組專案: 確認依賴 Weka 的模組正確傳遞依賴至 WAR 模組(<scope>compile</scope>)。

解決方案

  • 在 pom.xml 加入 Weka 依賴(compile 範圍),重新 mvn clean package。
  • 若 Weka 版本衝突(專案其他模組用不同版本),用 dependency:tree 分析,統一版本或用 <exclusion> 排除舊版。
  • 若 Weka 過大(含訓練資料),考慮只打包核心模組 weka-core,或改用輕量替代庫(Smile, Tribuo)。

驗證部署

# 部署後查看 Tomcat 日誌
tail -f $CATALINA_HOME/logs/catalina.out
# 應不再出現 ClassNotFoundException,改為正常啟動訊息

總結: ClassNotFoundException 即「類別不在 CLASSPATH」。WAR 部署時 CLASSPATH = WEB-INF/classes + WEB-INF/lib/*.jar。解壓 WAR 檢查 lib/ 目錄,缺什麼補什麼,通常是 Maven scope 設錯或打包配置排除了該 JAR。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved