我们正在尝试为我们的产品支持插件,而我正在使用反射从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。
答案 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();
}