..我有一个应用程序(.war),它有一个插件系统,其中每个可插件插件都是带有.jar依赖项的.jar。 在webapp中,通过管理Web界面,使用ClassLoader加载插件,该类“加载”.jar及其依赖项。 但问题是,例如,2个插件A和B可能有一个或多个公共依赖项(commons-io.jar,commons-collection.jar,...)...所以通常我不应该加载更多一次已经由另一个插件加载的.jar,或者已经存在于webapp本身中的.jar - > WEB-INF / lib目录/ 所以,我想知道是否有一种方法可以不加载另一个时间.jar已经通过webapp或其他插件加载 如果可能的话,我该怎么办呢!
实际上,无论可用的解决方案是什么,我只想避免类加载器问题。
注意:每个插件都是一个.zip文件,其中包含以下架构
插件名/
- code/
- A.class
- B.class
- ...
- lib/
- commons-io.jar
- log4j.jar
- ....
- description.xml
- version.txt
目录代码中的每个.class文件都由类加载器加载,插件的lib /目录中的每个.jar也被加载。
但通常,我不应该重新加载.jar“commons-io.jar”中存在的类,如果它已经存在的话......
我希望我已经足够清楚了,先谢谢你的关注和帮助。
答案 0 :(得分:6)
要跟踪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]
答案 1 :(得分:1)
如果使用-verbose:class
JVM选项,Sun Microsystems兼容的JVM也会在加载时显示类。但是,您无法以编程方式访问此信息。
答案 2 :(得分:0)
如果我理解正确你想知道是否已经加载了Java文件或jar,如果没有加载,那么你想要加载它吗?我得到的一个解决方案就是你可以检查类路径是否存在jar。