如何验证Java中的ClassLoader是否已加载.jar或类

pai*_*sad 4 java plugins web-applications jar classloader

..我有一个应用程序(.war),它有一个插件系统,其中每个可插入插件都是一个带有.jar依赖项的.jar.在webapp中,通过管理Web界面,使用ClassLoader加载插件,该类"加载".jar及其依赖项.但问题是,例如,2个插件A和B可能有一个或多个公共依赖项(commons-io.jar,commons-collection.jar,...)...所以通常我不应该加载更多一次.jar已经被另一个插件加载,或者已经存在于webapp本身 - > WEB-INF/lib /所以,我想知道是否有一种方法可以不加载另一个时间.jar已经存在了通过webapp或其他插件加载如果可能,我该怎么做!

实际上,无论可用的解决方案是什么,我只想避免类加载器问题.

注意:每个插件都是一个.zip文件,其中包含以下体系结构

插件名称/

       - code/

             - A.class

             - B.class

             - ...

       - lib/

            - commons-io.jar

            - log4j.jar

            - ....

       - description.xml

       - version.txt
Run Code Online (Sandbox Code Playgroud)

目录代码中的每个.class文件都由类加载器加载,插件的lib /目录中的每个.jar也被加载.

但通常,我不应该重新加载.jar"commons-io.jar"中存在的类,如果它已经存在的话......

我希望我已经足够清楚了,先谢谢你的关注和帮助.

sta*_*ker 6

要跟踪您可以添加的JVM加载的类

-verbose:class 
Display information about each class loaded.
Run Code Online (Sandbox Code Playgroud)

在启动JVM之前的选项.

它会产生类似的输出

[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]
Run Code Online (Sandbox Code Playgroud)