最近在一個沒有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)依類別名稱建構實例時若該名稱無法找到對應的類別就會噴錯。
沒有留言:
張貼留言