我们有一个在log4j上运行的旧桌面应用程序。此应用程序使用JNLP部署在用户系统上,然后连接到我们端的服务器。我们正在将此应用程序升级到log4j 2。我们已升级了服务器端代码,它工作正常。对于代码的JNLP端,虽然我们已经做了所有的更改并正确部署了应用程序,但我们最终还是遇到了一个异常,我们似乎没有找到原因。
例外情况如下所列。
java.lang.ClassNotFoundException: org.apache.log4j.Logger
at java.net.URLClassLoader.findClass(Unknown Source)
at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getConstructor(Unknown Source)
at org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:429)
at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:525)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:272)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:246)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:395)
at com.abcxyz.core.log.Logger.<clinit>(Logger.java:150)
at com.abcxyz.core.log.DefaultLog4jHelper.<init>(DefaultLog4jHelper.java:91)
at com.abcxyz.core.log.DefaultLog4jHelper.initLogger(DefaultLog4jHelper.java:44)
at com.abcxyz.ui.main.CMS.<clinit>(CMS.java:115)
at com.abcxyz.ui.main.InitializeCMS.main(InitializeCMS.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
异常指向log4j-1.2.17.jar(我们的旧jar)中的一个类文件。我确信我在代码中的任何地方都没有旧jar,或者代码的任何部分都没有引用旧jar文件。x1c 0d1x
下面粘贴的是JNLP的sysArgs部分,我在其中引用了新的属性文件
2条答案
按热度按时间cbwuti441#
我不熟悉JNLP,但根据你的堆栈跟踪,程序找不到。在Log4j 2包中,
org.apache.log4j
被改为org.apache.logging.log4j
。因此它不可用。1.在您的情况下最简单的解决方案之一-使用Log4j 1.x桥(这里是Migration guide)
1.如果要使用当前版本,请添加
<argument>
参数以使用log4j 2 impl(默认情况下,它使用为log4j 1.x配置的org.apache.commons.logging.impl.LogFactoryImpl
)org.apache.commons.logging.LogFactory=org.apache.logging.log4j.jcl.LogFactoryImpl
iyzzxitl2#
我们已经找到了解决办法。在我们的情况下,有两个问题
1.在log4j 2-API jar中,有一个log4j-character.properties文件,该文件在使用ant脚本对jar进行签名时损坏。签名后,我们将jar中的此文件替换为签名前保存的文件副本。
上面的步骤解决了我们的问题。我知道我上面写的可能对某人没有多大意义。很高兴提供屏幕截图,以防按需有人遇到这个问题。