2011-11-15 28 views
4

..我有一個應用程序(一個.war),它有一個插件系統,其中每個插件插件都是.jar及其jar文件.jar依賴。 而在webapp中,通過管理Web界面,插件通過使用ClassLoader加載.jar及其依賴關係。 但問題是,例如,2個插件A和B可能有一個或多個通用依賴項(commons-io.jar,commons-collection.jar,...)...所以通常我不應該加載更多一旦.jar已經被另一個插件加載,或者已經存在於webapp本身 - > WEB-INF/lib/ 因此,我想知道是否有一種方法可以不加載另一個.jar文件已經通過webapp或其他插件加載 如果可能,我該怎麼做!如何驗證.jar或類已被ClassLoader加載到Java

其實,無論有什麼解決方案,我只是想避免類加載器問題。

注:各插件是具有到它下面的架構

插件名稱/

 - code/ 

      - A.class 

      - B.class 

      - ... 

     - lib/ 

      - commons-io.jar 

      - log4j.jar 

      - .... 

     - description.xml 

     - version.txt 

在目錄中的每個代碼.class文件/由類加載器加載的.zip文件,插件的lib /目錄中的每個.jar也會被加載。

但通常情況下,我不應該再加載存在於的.jar類「公地io.jar」如果以往任何時候都已經存在......

我希望我已經足夠清楚,謝謝提前注意和幫助。

+0

是否有可能兩個插件需要不同版本的相同依賴項?或者這不是一個問題? – kylewm

+0

是的,有可能2個插件具有不同版本的相同依賴關係 – paissad

回答

6

要跟蹤哪些類是由JVM加載,你可以在啓動JVM之前添加

-verbose:class 
Display information about each class loaded. 

爲了你的選擇。

它WILLE創建像

[Opened C:\Program Files\Java\jre6\lib\rt.jar] 
[Loaded java.lang.Object from C:\Program Files\Java\jre6\lib\rt.jar] 
[Loaded java.io.Serializable from C:\Program Files\Java\jre6\lib\rt.jar] 
[Loaded java.lang.Comparable from C:\Program Files\Java\jre6\lib\rt.jar] 
[Loaded java.lang.CharSequence from C:\Program Files\Java\jre6\lib\rt.jar] 
[Loaded java.lang.String from C:\Program Files\Java\jre6\lib\rt.jar] 
1

一個Sun微系統兼容的JVM的輸出也將顯示類,如果您使用的是-verbose:class JVM的選擇,因爲它們的加載。但是,無法以編程方式訪問此信息。

0

如果我理解正確,你想知道一個Java文件或jar是否已經加載,如果沒有加載只有你想加載它?我得到的一個解決方案就像您可以檢查類路徑是否存在該jar。

相關問題