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?
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.
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'
}
}