我們有一個web應用程序,它的實例在同一個tomcat(v6.0.14)實例下被多次部署。假設war文件被命名爲「app.war」,那麼我們部署「app1.war」,「app2.war」等等。tomcat中的ClassNotFoundException對於servlet代碼中的內部類
所有應用程序實例(〜20)都得到正確部署。當訪問這些應用程序上的servlet時,有時會由於012xx在tomcat的WebAppClassLoader
中導致NoClassDefFoundError
而失敗。以下是一個示例 -
java.lang.NoClassDefFoundError: com/xxx/APISocketServer$ClientRequestHandler
at com.xxx.APISocketServer$APISocketServerThread.run(APISocketServer.java:143)
Caused by: java.lang.ClassNotFoundException: com.xxx.APISocketServer$ClientRequestHandler
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1358)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
... 1 more
違規類是應用程序代碼的一部分,不屬於任何庫。
由於某些應用程序實例正常運行,因此這不能是類路徑錯誤配置的情況。有一點需要注意的是,只有幾個類無法加載。這些類沒有任何靜態初始化塊,這可能導致類初始化失敗。我已經檢查過tomcat日誌(catalina.out,localhost.log)並且沒有發現任何類初始化錯誤。
我該如何着手調試這個問題?
發佈顯示兩個錯誤的堆棧跟蹤。如果沒有,我們將視您對問題的解釋而定。 – 2013-03-04 05:58:34
@JimGarrison我在問題中添加了異常。 – 2013-03-04 06:21:18
Java版本是否正確?通常,這些錯誤會發生在損壞或不正確的JDK版本中。嘗試將JAVA_HOME設置爲另一個JDK。 – Rhys 2013-03-04 07:35:58