LogManager.getLogger () не может определить имя класса на Java 11 - PullRequest
0 голосов
/ 23 октября 2018

Я использую log4j2 (2.11.1) с Java 11 и пытаюсь получить объект Logger, используя:

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 голосов
/ 06 августа 2019

Ответ @DanielScott правильный.При использовании плагина Gradle Shadow я добавил следующее в свой build.gradle, чтобы добавить флаг Multi-Release:true к манифесту.

jar {
    manifest {
        attributes 'Multi-Release': 'true'
    }
}
0 голосов
/ 23 октября 2018

Причина была в том, что файлы классов с несколькими выпусками не выбирались из META-INF/versions/*, потому что я не установил флаг многократного выпуска при создании затененной банки.

Мне нужно было добавить:

Multi-Release:true

На мой манифест, и все заработало.

...