web-dev-qa-db-fra.com

LogManager.getLogger () ne parvient pas à déterminer le nom de classe sur Java 11

J'utilise log4j2 (2.11.1) avec Java 11 et j'essaie d'obtenir un objet Logger en utilisant:

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

(Importé de log4j-api dans org.Apache.logging.log4j)

Au moment de l'exécution, je reçois l'erreur suivante:

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)

Ce qui est logique - getCallerClass n'est pas pris en charge et le consignateur n'est donc pas en mesure de déterminer le nom de la classe.

Est-il censé fonctionner de cette façon? Je n'ai sûrement pas à coder en dur le nom de la classe dans chaque enregistreur?

16
Daniel Scott

La raison en était que les fichiers de classe à plusieurs versions n'étaient pas récupérés à partir de META-INF/versions/* parce que je n'avais pas défini le drapeau multi-version lorsque j'ai construit mon pot ombré.

J'avais besoin d'ajouter:

Multi-Release:true

À mon manifeste, et tout a commencé à fonctionner.

11
Daniel Scott

La réponse de @DanielScott est correcte. Lors de l'utilisation du plugin Gradle Shadow, j'ai ajouté ce qui suit à mon build.gradle pour ajouter le Multi-Release:true drapeau vers le manifeste.

jar {
    manifest {
        attributes 'Multi-Release': 'true'
    }
}
1
Chad Lad