log4j 与 jdk21 兼容吗?

问题描述 投票:0回答:1

当我尝试使用 ant 单个 jar 文件构建时,该文件使用

jar-in-jar-loader
,里面的所有内容看起来都符合预期。清单内容是

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.10.14
Created-By: 21+35-LTS-2513 (Oracle Corporation)
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
Rsrc-Main-Class: a.b.MyApp
Multi-Release: true
Rsrc-Class-Path: ./ lib/log4j/log4j-api-2.22.1.jar lib/log4j/log4j-cor
 e-2.22.1.jar lib/jdatepicker-1.3.4.jar
Class-Path: .

jar-in-jar-loader.zip
是由使用jdk21的eclipse 2023-12生成的,所有文件似乎都在myApp.jar中
然而,当我使用
java -jar myApp.jar
时,我明白了

WARNING: Runtime environment or build system does not support multi-release JARs. This will impact location-based features.
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:62)
Caused by: java.lang.UnsupportedOperationException: No class provided, and an appropriate one cannot be found.
        at org.apache.logging.log4j.LogManager.callerClass(LogManager.java:585)
        at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:610)
        at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:597)
        at a.b.log.Log.getLogger(Log.java:48)
        at a.b.MyApp.handleInputParameters(MyApp.java:97)
        at a.b.MyApp.main(MyApp.java:33)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        ... 2 more

当我在 Eclipse 下运行应用程序时,一切正常。
这是否意味着log4j不能与jdk21一起使用(我使用Oracle版本)?
如何检查呢?我尝试了 log4j 网页,但没有发现任何内容(特别是在变更日志中)。我也尝试将项目降级到jdk17,也没有效果。
如何解决这个问题?

java eclipse jar log4j2 uberjar
1个回答
1
投票

这实际上是由 Eclipse

jar-in-jar
加载器中的错误引起的:cf. eclipse-jdt/eclipse.jdt.ui#1057.

同时您可以:

  • 通过设置
    -Djdk.util.jar.EnableMultiRelease=force
    ,
  • 强制所有 JAR 文件以多重发布模式打开
  • 切换到另一个加载程序。
    spring-boot-loader
    维护得更好,可在 Maven Central 上使用,并且它不会创建临时文件来打开嵌入式库。
© www.soinside.com 2019 - 2024. All rights reserved.