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

如何验证Java中的类加载器是否已经加载了.jar或类,java,web-applications,plugins,jar,classloader,Java,Web Applications,Plugins,Jar,Classloader,。。我有一个应用程序(a.war),它有一个插件系统,其中每个可插入插件都是一个.jar及其.jar依赖项。 在webapp中,通过一个管理web界面,使用类加载器加载插件,该类加载器“加载”了.jar及其依赖项。 但问题是,例如,2个插件A和B可能有一个或多个公共依赖项(commons-io.jar、commons-collection.jar等等)。。。因此,通常我不应该再加载一次.jar,它已经被另一个插件加载,或者已经存在于webapp本身->WEB-INF/lib中/ 因此,我想知道是

。。我有一个应用程序(a.war),它有一个插件系统,其中每个可插入插件都是一个.jar及其.jar依赖项。 在webapp中,通过一个管理web界面,使用类加载器加载插件,该类加载器“加载”了.jar及其依赖项。 但问题是,例如,2个插件A和B可能有一个或多个公共依赖项(commons-io.jar、commons-collection.jar等等)。。。因此,通常我不应该再加载一次.jar,它已经被另一个插件加载,或者已经存在于webapp本身->WEB-INF/lib中/ 因此,我想知道是否有一种方法可以避免再次加载一个已经通过webapp或其他插件加载的.jar 如果可能的话,我必须怎么做

实际上,不管有什么解决方案,我只是想避免类加载器问题

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

插件名/

       - code/

             - A.class

             - B.class

             - ...

       - lib/

            - commons-io.jar

            - log4j.jar

            - ....

       - description.xml

       - version.txt
目录code/中的每个.class文件都由类加载器加载,插件的lib/目录中的每个.jar也被加载

但通常,我不应该重新加载.jar“commons io.jar”中已经存在的类


我希望我已经说得够清楚了,提前感谢您的关注和帮助。

要跟踪JVM加载了哪些类,您可以添加这些类

-verbose:class 
Display information about each class loaded.
在启动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]

如果使用
-verbose:class
JVM选项,与Sun Microsystems兼容的JVM也会在加载时显示类。但是,您无法通过编程方式访问此信息。

如果我理解正确,您想知道Java文件或jar是否已加载,如果未仅加载,那么您想加载它吗?我得到的一个解决方案是,您可以检查类路径是否存在jar

两个插件是否可能需要相同依赖项的不同版本?或者这不是一个问题?是的,可能有两个插件具有相同依赖项的不同版本