JNLP结果中的log4j2找不到类异常

flvtvl50  于 2022-12-13  发布在  其他
关注(0)|答案(2)|浏览(158)

我们有一个在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部分,我在其中引用了新的属性文件

cbwuti44

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.LogFactoryImplorg.apache.commons.logging.LogFactory=org.apache.logging.log4j.jcl.LogFactoryImpl

iyzzxitl

iyzzxitl2#

我们已经找到了解决办法。在我们的情况下,有两个问题

  1. jar签名不正确。这些jar在meta-inf文件夹下具有清单文件。此文件夹的值已损坏。我们手动编辑了该文件并保留了除SHA密钥之外的所有内容的原始值,然后重新签名这些jar。
    1.在log4j 2-API jar中,有一个log4j-character.properties文件,该文件在使用ant脚本对jar进行签名时损坏。签名后,我们将jar中的此文件替换为签名前保存的文件副本。
    上面的步骤解决了我们的问题。我知道我上面写的可能对某人没有多大意义。很高兴提供屏幕截图,以防按需有人遇到这个问题。

相关问题