2011-04-05 128 views
0

背景第一:在WindowsXP的&的OpenSUSE SLEDservlet能夠真正訪問Tomcat的lib目錄中的jar嗎?

  • 的Tomcat 6.0 11.0(在兩個平臺上相同的結果)
  • 的Oracle JDK V6
  • 春3.0
  • Javolution 5.5.1

我已經用我的應用程序使用的jar(javolution-5.5.1.jar)得到了一個奇怪的問題。我已經有一段時間在WEB-INF/lib中有這個jar了,沒有任何問題。我們確定這個jar實際上需要在Tomcat的lib目錄中,而不是我們的應用程序的lib目錄,因爲它在多個應用程序中共享,所以我們移動了它。

但是,這樣做會導致新的RuntimeException嘗試訪問從javolution.jar擴展Struct的類(Scinv)。這是否有某種原因導致應用程序無法通過這種方式從Tomcat的lib目錄中訪問JAR中的類?

我的班級(不相關的細節刪除):

import javolution.io.Struct; 
public class Scinv extends Struct { 
    public static methodA() {...} 
    public static methodB() {...} 
    public static class ProdRecs extends Struct {...} 
    public static class ProdRec extends Struct {...} 
} 

當我嘗試訪問Scinv,這使得使用靜態嵌套類的靜態方法,我得到這個:

Apr 5, 2011 3:40:50 PM org.apache.catalina.core.ApplicationDispatcher invoke 
SEVERE: Servlet.service() for servlet inventory threw exception 
java.lang.RuntimeException: Struct class: general.dao.externalfiles.Scinv$ProdRec not found 
at javolution.io.Struct.array(Struct.java:557) 
at general.dao.externalfiles.Scinv$ProdRecs.<init>(Scinv.java:447) 

Apr 5, 2011 3:40:50 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet default threw exception 
java.lang.RuntimeException: Struct class: general.dao.externalfiles.Scinv$ProdRec not found 
at javolution.io.Struct.array(Struct.java:557) 
at general.dao.externalfiles.Scinv$ProdRecs.<init>(Scinv.java:447) 

我所要做的就是將javolution-5.5.1.jar從Tomcat/lib移動到我的WEB-INF/lib目錄,並且應用程序再次正常工作,沒有RuntimeExceptions。

任何想法,爲什麼這是失敗?我們在Tomcat/lib目錄中也有postgres-9.0.jar文件,它似乎工作正常。

我很樂意提供更多的細節,如果你需要他們,任何建議將不勝感激,因爲我有點難倒這一個!

+0

好的,如果你重新啓動tomcat,它是否正確啓動而不會拋出異常?日誌說什麼? – 2011-04-05 21:26:55

+0

我已經幾次重啓Tomcat無濟於事。我添加了上面看到的所有日誌消息。順便說一下,它總是啓動正常,只有當我嘗試訪問Scinv時,它會拋出RuntimeException。 – Jay 2011-04-05 21:32:30

+0

檢查我的答案。 – 2011-04-05 21:51:16

回答

1

我不認爲這是將javolution-5.5.1.jar放入TOMCAT_HOME/lib文件夾的問題,JVM會擔心Struct對象已經(javolution.io.Struct.array(Struct.java:557))。問題的真正原因是:general.dao.externalfiles.Scinv$ProdRecs類中的構造函數發生了什麼(Scinv.java:447)?有些東西會導致對象不初始化,從而導致運行時異常。

+0

我認爲你正走向正確的軌道。 Javolution圖書館正在做一些緩存類和內部管理類加載器,現在我認爲我的問題更多的是庫本身。我將繼續研究這個問題併發布我的結果。 – Jay 2011-04-06 16:05:14

+0

狀態更新:事實證明,這個問題是由庫本身引起的。正如我所說,它試圖在內部進行類加載,並且它使用的算法是無效的。所以,我在Scinv $ ProdRecs中的構造函數失敗,並帶有RuntimeException。非常感謝* SO *爲我帶來了這個方向! – Jay 2011-04-07 15:42:21

+0

這是我的榮幸。 :) – 2011-04-07 15:51:32