網頁

2020/9/15

Java 程式執行時出現NoClassDefFoundError錯誤

最近在一個沒有CICD自動部屬的老舊專案。修改好的Java程式如果需要在Dev環境測試,需要把本機編譯好的class檔手動貼到Dev環境的Tomcat WEB/INF/classes下對照package結構的目錄中來更新。

在本機執行某項功能時明明都正常,但在Dev環境測試時確出現NoClassDefFoundError錯誤。

錯誤訊息如下,說找不到com/abc/util/DemoUtils這支class檔。

java.lang.NoClassDefFoundError: com/abc/util/DemoUtils
    at com.abc.api.handler.handle(DemoApiHandler.java:109)
    at com.abc.api.servlet.ApiServlet.doPost(ApiServlet.java:98)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    ...

最後發現原來是DemoUtils.class沒有放在Tomcat 下的WEB-INF/classes/com/abc/util而是貼錯到別的地方,因此在Dev執行期間(runtime)執行到DemoUtils的程式時會出現NoClassDefFoundError錯誤。

NoClassDefFoundError與常見的ClassNotFoundException差別在於,
NoClassDefFoundError是無法捕捉的錯誤(Error),是執行期間(runtime)錯誤;
ClassNotFoundException是可捕捉的例外(Exception),是編譯期間(compile time)錯誤。通常在類別載入器(Class loader)依類別名稱建構實例時若該名稱無法找到對應的類別就會噴錯。


沒有留言:

張貼留言