LogManager.getLogger() 无法在 Java 11 上确定 class 名称

LogManager.getLogger() is unable to determine class name on Java 11

我将 log4j2 (2.11.1) 与 Java 11 一起使用,并尝试使用以下方法获取 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 不受支持,因此记录器无法确定 class 名称。

它应该这样工作吗?当然,我不必将 class 名称硬编码到每个记录器中?

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

我需要补充:

Multi-Release:true

根据我的清单,一切都开始工作了。

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

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