4

slf4j-api-1.7.5 と simple-1.7.5 のような slf4j ロガーを groovy 2.1.6 プロジェクトに含めると、ロガーをインスタンス化する最初のクラスが読み込まれるとすぐに次の例外が発生します。

Caught: java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of org/codehaus/groovy/tools/RootLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for resolved class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type taticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory; used in the signature
java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of org/codehaus/groovy/tools/RootLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for resolved class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type taticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory; used in the signature
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:299)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:269)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:281)
    at Server.<clinit>(Server.java:29)
    at Test.run(Test.groovy:15)

詳細な jvm 出力を調べてみると、例外が出力される前に次の行が見つかりました。

[Loaded org.slf4j.ILoggerFactory from file:/home/user/.gradle/caches/artifacts-26/filestore/org.slf4j/slf4j-api/1.7.5/jar/6b262da268f8ad9eff941b25503a9198f0a0ac93/slf4j-api-1.7.5.jar]
...
[Loaded org.slf4j.ILoggerFactory from file:/home/user/.gradle/caches/artifacts-26/filestore/org.slf4j/slf4j-api/1.7.5/jar/6b262da268f8ad9eff941b25503a9198f0a0ac93/slf4j-api-1.7.5.jar]

Groovy RootLoader と Java AppClassLoader がクラス ILoggerFactory 自体をロードしようとし、最終的に 2 つの「バージョン」になるようです (どちらもおそらく等しいですが、jvm はこれを認識していないようです)。これらの ClassLoaders の 1 つが ILoggerFactory をロードするのを防ぎ、最終的にログを機能させるにはどうすればよいですか?

4

0 に答える 0