Groovy ClassLoader загружает ILoggerFactory дважды

При включении slf4j-api-1.7.5 и логгера slf4j, такого как simple-1.7.5, в проект groovy 2.1.6, я получаю следующее исключение, как только загружается первый экземпляр класса, запускающий Logger:

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 сами и в итоге получают две "версии" (обе они, вероятно, равны, но jvm, похоже, этого не распознает). Как я могу предотвратить загрузку ILoggerFactory одним из этих ClassLoaders и, наконец, запустить регистрацию?

0 ответов

Другие вопросы по тегам