2013-03-04 64 views
1

我們有一個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)並且沒有發現任何類初始化錯誤。

我該如何着手調試這個問題?

+0

發佈顯示兩個錯誤的堆棧跟蹤。如果沒有,我們將視您對問題的解釋而定。 – 2013-03-04 05:58:34

+0

@JimGarrison我在問題中添加了異常。 – 2013-03-04 06:21:18

+0

Java版本是否正確?通常,這些錯誤會發生在損壞或不正確的JDK版本中。嘗試將JAVA_HOME設置爲另一個JDK。 – Rhys 2013-03-04 07:35:58

回答

2

在進一步調查中,發現打開文件描述符(1024)的限制是罪魁禍首。每個應用程序實例都需要自己的類加載器打開的Jar文件的副本(WebappClassLoader)。如果90秒內沒有訪問Jar文件中的類,則類加載器會關閉這些文件。如果在短時間內訪問多個應用程序實例,則openJARs函數將失敗,導致該類未被加載。

如果WebappClassLoader在更高的日誌級別打開JAR文件失敗,則會發現錯誤的時間要早​​得多。該錯誤記錄在調試級別。啓用調試級別爲WebappClassLoader,有助於找出問題。

相關問題