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

Kettle 在 Web 應用中報 NoClassDefFoundError:scannotation 依賴缺失解決方案

     編輯:程式設計疑難解答

錯誤堆棧


Caused by: java.lang.NoClassDefFoundError: org/scannotation/AnnotationDB
    at org.pentaho.di.core.plugins.BasePluginType.findAnnotatedClassFiles...
Caused by: java.lang.ClassNotFoundException: org.scannotation.AnnotationDB

獨立運行 Kettle 轉換正常,放入 Web 應用 (Tomcat/Quartz) 即報錯。

根本原因

Kettle 核心依賴 scannotation 庫掃描註解插件,**Web 類加載器隔離**導致該 Jar 未被加載。獨立運行時由 Kettle Launcher 類加載器統一加載所有依賴;Web 容器中需顯式放入 `WEB-INF/lib` 或共享類加載器路徑。

解決方案

方案一:Maven 項目直接加坐標(推薦)


<dependency>
    <groupId>org.scannotation</groupId>
    <artifactId>scannotation</artifactId>
    <version>1.0.3</version> <!-- 或 1.0.2 -->
</dependency>

打包 WAR 時自動進入 `WEB-INF/lib`,WebAppClassLoader 即可加載。

方案二:手動放 Jar 包

  1. 下載 scannotation-1.0.3.jar (Maven Central)。
  2. 放入項目 `WebContent/WEB-INF/lib/` (或 `src/main/webapp/WEB-INF/lib/`)。
  3. 重新部署應用。

方案三:Tomcat 共享庫(多應用共享 Kettle)

  • 將 `scannotation.jar` + `kettle-core.jar` 等核心包放入 `$CATALINA_HOME/lib/`。
  • 配置 `catalina.properties` 中 `shared.loader` 路徑。
  • 注意版本衝突風險,**不推薦**生產環境。

依賴傳遞檢查清單

Kettle 運行還需以下核心依賴(Maven 會自動傳遞):

  • `pentaho-kettle-core` / `kettle-engine`
  • `commons-vfs2` (VFS 文件系統)
  • `commons-httpclient` / `httpcore` / `httpclient`
  • `jetty-*` (內嵌 Servlet 容器)
  • `scannotation` (註解掃描,**易缺失**)
  • `jackson-*` / `commons-lang3` / `guava` 等工具包

建議直接依賴 `org.pentaho.kettle:kettle-core` 讓 Maven 遞傳解析全鏈路。

總結

Web 應用嵌入 Kettle,**缺 Jar 是常態**。引入 `scannotation` 解決 `AnnotationDB` 找不到,再按異常堆棧補齊後續缺失 Jar,直到 `KettleEnvironment.init()` 成功。Maven 依賴管理是根治之道。

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