LogManager.getLogger() 无法确定 Java 11 上的类名



我在Java 11中使用log4j2(2.11.1(,并尝试使用以下方法获取Logger对象:

private static final Logger LOG = LogManager.getLogger();

(org.apache.logging.log4j年从log4j-api进口(

在运行时,我收到以下错误:

WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.UnsupportedOperationException: No class provided, and an appropriate one cannot be found.
at 
org.apache.logging.log4j.LogManager.callerClass(LogManager.java:555)
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:580)
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:567)
at app.App.<clinit>(App.java:11)

这确实有意义 - 不支持getCallerClass,因此记录器无法确定类名。

它应该以这种方式工作吗?当然,我不必将类名硬编码到每个记录器中吗?

原因是没有从META-INF/versions/*中选取多版本类文件,因为我在构建阴影罐时没有设置多版本标志。

我需要补充:

Multi-Release:true

到我的清单,一切都开始工作。

@DanielScott的答案是正确的。使用 Gradle Shadow 插件时,我将以下内容添加到我的build.gradle中,以将Multi-Release:true标志附加到清单中。

jar {
manifest {
attributes 'Multi-Release': 'true'
}
}

最新更新