NoClassDefFoundError使用URLClassLoader加载类

时间:2018-06-29 19:14:50

标签: java reflection urlclassloader

我们正在尝试为我们的产品支持插件,而我正在使用反射从jar中加载类。

我创建一个URL ClassLoader,并将所有依赖项jar添加为URL。

我使用该ClassLaoder加载插件的主类。

我得到了一个类的实例和一个方法引用(一个run()方法)。

当我调用该方法时,出现此异常:

java.lang.NoClassDefFoundError:无法初始化类org.apache.logging.log4j.util.PropertiesUtil

此类位于log4j-api-2.10.0.jar中,该文件包含在ClassLoader的类路径中。

我可以在调试时在类加载器中看到该URL,因此我知道它的正确引用。

有时候我会得到一个不同的错误,说它不能初始化我的一个类,但是那个类没有什么特别的,没有静态的东西。

通过反射加载的主要类正在调用使用Log4j 2的第二个类。

当主类run()方法尝试实例化发生此问题的第二类时。

除了Logger之外,这两个类中没有任何静态变量。

在调试器中,我可以从Method ref中看到,该类确实已使用我们创建的URL ClassLoader加载。

这段代码已经使用了十年了,我们唯一改变的是在插件中升级到Log4j 2。 进行反射性插件加载的类只是应用程序类路径中的普通类。

任何帮助将不胜感激。

使用细雨的建议,我得到了:

Exception in thread "ServerStatus:update_timer:" java.lang.ExceptionInInitializerErrorException in thread "ServerStatus:update_timer:" java.lang.ExceptionInInitializerError
    at java.lang.Class.forName0(Native Method)  at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)  at java.lang.Class.forName(Unknown Source)
    at ...
    at java.lang.Thread.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassCastException: java.util.Vector cannot be cast to java.lang.StringCaused by: java.lang.ClassCastException: java.util.Vector cannot be cast to java.lang.String
    at org.apache.logging.log4j.util.SystemPropertiesPropertySource.forEach(SystemPropertiesPropertySource.java:39)
    at org.apache.logging.log4j.util.SystemPropertiesPropertySource.forEach(SystemPropertiesPropertySource.java:39)
    at org.apache.logging.log4j.util.PropertiesUtil$Environment.reload(PropertiesUtil.java:330) at org.apache.logging.log4j.util.PropertiesUtil$Environment.reload(PropertiesUtil.java:330)
    at org.apache.logging.log4j.util.PropertiesUtil$Environment.<init>(PropertiesUtil.java:322) at org.apache.logging.log4j.util.PropertiesUtil$Environment.<init>(PropertiesUtil.java:322)
    at org.apache.logging.log4j.util.PropertiesUtil$Environment.<init>(PropertiesUtil.java:310) at org.apache.logging.log4j.util.PropertiesUtil$Environment.<init>(PropertiesUtil.java:310)
    at org.apache.logging.log4j.util.PropertiesUtil.<init>(PropertiesUtil.java:69)  at org.apache.logging.log4j.util.PropertiesUtil.<init>(PropertiesUtil.java:69)
    at org.apache.logging.log4j.util.PropertiesUtil.<clinit>(PropertiesUtil.java:49)    at org.apache.logging.log4j.util.PropertiesUtil.<clinit>(PropertiesUtil.java:49)

更新:Log4j 2版本2.10.x及更高版本存在错误。加载类可以反映出这些错误。切换回2.8.2,以上异常消失了。但是,现在我仍然可以为我的一个课程获取ClassNotFound。

2 个答案:

答案 0 :(得分:0)

将Log4j备份到2.8.2已解决的问题。它是Log4j的错误。谢谢您的帮助。很难找到的人。

答案 1 :(得分:-1)

这可能有助于解决java.lang.NoClassDefFoundError

try {
    Class.forName("org.apache.logging.log4j.util.PropertiesUtil");
} catch (Exception e) {
    e.printStackTrace();
}