2011-11-15 29 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。

相关问题