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

时间:2018-10-23 16:06:54

标签: java log4j2 java-11

我正在将log4j2(2.11.1)与Java 11结合使用,并尝试使用以下方法获取LOG对象:

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

(从log4j-api中的org.apache.logging.log4j导入)

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

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,因此记录器无法确定类名。

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

2 个答案:

答案 0 :(得分:9)

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

我需要添加:

Multi-Release:true

据我所知,一切开始起作用。

答案 1 :(得分:3)

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

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