Java 11でlog4j2(2.11.1)を使用しており、次を使用して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はサポートされていないため、ロガーはクラス名を判別できません。
このように機能するはずですか?確かに、クラス名を各ロガーにハードコードする必要はありませんか?
その理由は、シェーディングされたjarをビルドするときにマルチリリースフラグを設定していなかったため、マルチリリースクラスファイルがMETA-INF/versions/*
から取得されなかったためです。
追加する必要がありました:
Multi-Release:true
私のマニフェストに、そしてすべてが機能し始めました。
@DanielScottの答えは正しいです。 Gradle Shadowプラグインを使用する場合、build.gradleに以下を追加して、マニフェストにMulti-Release:true
フラグを追加しました。
jar {
manifest {
attributes 'Multi-Release': 'true'
}
}