web-dev-qa-db-ja.com

LogManager.getLogger()がJava 11のクラス名を判別できません

Java 11でlog4j2(2.11.1)を使用しており、次を使用してLoggerオブジェクトを取得しようとしています。

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

log4j-apiorg.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はサポートされていないため、ロガーはクラス名を判別できません。

このように機能するはずですか?確かに、クラス名を各ロガーにハードコードする必要はありませんか?

16
Daniel Scott

その理由は、シェーディングされたjarをビルドするときにマルチリリースフラグを設定していなかったため、マルチリリースクラスファイルがMETA-INF/versions/*から取得されなかったためです。

追加する必要がありました:

Multi-Release:true

私のマニフェストに、そしてすべてが機能し始めました。

11
Daniel Scott

@DanielScottの答えは正しいです。 Gradle Shadowプラグインを使用する場合、build.gradleに以下を追加して、マニフェストにMulti-Release:trueフラグを追加しました。

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