Gradle Groovy@Slf4j注释:“注释”;类路径包含多个SLF4J绑定;

Gradle Groovy@Slf4j注释:“注释”;类路径包含多个SLF4J绑定;,gradle,groovy,annotations,logback,slf4j,Gradle,Groovy,Annotations,Logback,Slf4j,关于这个主题有几个问题,但我找不到一个与Groovy@Slf4j“AST”注释相关的问题。从表面上看,这不仅很方便,而且可以根据日志级别有条件地执行内容 在我的书《Groovy In Action》中,它说: 将Slf4j记录器作为静态最终org.Slf4j.logger注入到 类并使用 org.slf4j.LoggerFactory.getLogger(类)。LogBack框架使用 SLF4J作为底层记录器,因此LogBack用户应该使用@SLF4J 这就是我正在做的。这是我的渐变身材 com

关于这个主题有几个问题,但我找不到一个与Groovy
@Slf4j
“AST”注释相关的问题。从表面上看,这不仅很方便,而且可以根据日志级别有条件地执行内容

在我的书《Groovy In Action》中,它说:

将Slf4j记录器作为静态最终org.Slf4j.logger注入到 类并使用 org.slf4j.LoggerFactory.getLogger(类)。LogBack框架使用 SLF4J作为底层记录器,因此LogBack用户应该使用@SLF4J

这就是我正在做的。这是我的渐变身材

compile 'ch.qos.logback:logback-classic:1.2.1'
。。。我已经找到了一个简单的logback-test.xml

但每次我运行带有此注释的测试类,或直接运行应用程序时,我都会得到:

SLF4J:类路径包含多个SLF4J绑定。SLF4J:已找到 在[jar:file:/D:/apps/…中绑定。。。 fbb0e/logback-classic-1.2.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J:在[jar:file:/D:/apps/…中找到绑定。。。 eca4e/slf4j-log4j12-1.7.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J:有关详细信息,请参阅 解释
SLF4J:实际绑定的类型为 [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

。。。特别是,这有点“污染”我的测试的
stderr
输出

我尝试手动删除slf4j-log4j12-1.7.6.jar文件。。。但它在下一个Gradle任务中被自动重新生成

他是这本书的作者之一。是的,乔恩·斯基特。救救乔恩

回答这两条评论(谢谢!)
... 这是输出

+--- org.codehaus.groovy:groovy-all:2.6.0-alpha-2
+--- net.bytebuddy:byte-buddy:1.6.11
+--- commons-io:commons-io:2.6
+--- org.apache.odftoolkit:simple-odf:0.8.2-incubating
|    +--- org.apache.odftoolkit:odfdom-java:0.8.11-incubating
|    |    +--- org.apache.odftoolkit:taglets:0.8.11-incubating
|    |    +--- xerces:xercesImpl:2.9.1 -> 2.11.0
|    |    |    \--- xml-apis:xml-apis:1.4.01
|    |    +--- xml-apis:xml-apis:1.3.04 -> 1.4.01
|    |    +--- org.apache.jena:jena-core:2.11.2
|    |    |    +--- org.slf4j:slf4j-api:1.7.6 -> 1.7.22
|    |    |    +--- org.apache.jena:jena-iri:1.0.2
|    |    |    |    +--- org.slf4j:slf4j-api:1.7.6 -> 1.7.22
|    |    |    |    \--- log4j:log4j:1.2.17
|    |    |    +--- xerces:xercesImpl:2.11.0 (*)
|    |    |    \--- log4j:log4j:1.2.17
|    |    +--- net.rootdev:java-rdfa:0.4.2
|    |    |    +--- org.apache.jena:jena-iri:0.9.1 -> 1.0.2 (*)
|    |    |    \--- org.slf4j:slf4j-api:1.5.6 -> 1.7.22
|    |    \--- commons-validator:commons-validator:1.5.0
|    |         +--- commons-beanutils:commons-beanutils:1.9.2
|    |         |    +--- commons-logging:commons-logging:1.1.1 -> 1.2
|    |         |    \--- commons-collections:commons-collections:3.2.1 -> 3.2.2
|    |         +--- commons-digester:commons-digester:1.8.1
|    |         +--- commons-logging:commons-logging:1.2
|    |         \--- commons-collections:commons-collections:3.2.2
|    +--- xerces:xercesImpl:2.9.1 -> 2.11.0 (*)
|    \--- xml-apis:xml-apis:1.3.04 -> 1.4.01
+--- org.apache.lucene:lucene-core:6.+ -> 6.6.2
+--- org.apache.lucene:lucene-analyzers-common:6.+ -> 6.6.2
|    \--- org.apache.lucene:lucene-core:6.6.2
+--- org.apache.lucene:lucene-queryparser:6.+ -> 6.6.2
|    +--- org.apache.lucene:lucene-core:6.6.2
|    +--- org.apache.lucene:lucene-queries:6.6.2
|    \--- org.apache.lucene:lucene-sandbox:6.6.2
+--- commons-io:commons-io:2.5 -> 2.6
\--- ch.qos.logback:logback-classic:1.2.1
     +--- ch.qos.logback:logback-core:1.2.1
     \--- org.slf4j:slf4j-api:1.7.22

显然,Szymon Stepniak的评论是正确的。现在,我只需要找出如何排除罪魁祸首(odftoolkit)包对log4j的这种使用。。。我发现有人正想这么做。

您在控制台中看到的此错误消息实际上与代码中使用的
@Slf4j
注释无关-它只是简化了向类中添加
log
字段的过程。您的问题是由在类路径中找到的多个
org.slf4j.impl.StaticLoggerBinder
类引起的。要解决此问题,您必须首先使用以下方法检查依赖关系树:

gradle dependencies --configuration runtime
它将显示所有依赖项的完整树。然后,您可以跟踪哪个依赖项正在向类路径添加额外的记录器。正如您在评论中提到的,在您的案例中,它是
org.apache.odftoolkit:simple odf:0.8.2-incubating
添加
log4j
依赖项

知道您必须排除组
org.slf4j
log4j
的可传递依赖项,这些依赖项随
org.apache.odftoolkit:simple odf:0.8.2-incubing一起提供。在
build.gradle
文件中定义此依赖项,如下所示:

compile ("org.apache.odftoolkit:simple-odf:0.8.2-incubating") {
    exclude group: 'org.slf4j'
    exclude group: 'log4j'
}

出于兴趣,虽然Szymon Stepniak的解决方案可能是最好的解决方案,但还有另一个解决方案,我基本上是从中获得的:


。。。我想这可能有一个好处,那就是您不必单独处理每个有问题的包的排除

能否将
/gradlew依赖项--configuration runtime
的输出添加到问题中?一个(或多个)依赖项将
slf4j-log4j12
添加到类路径中。解决方案是跟踪它并将其排除在
build.gradle
中。在不知道您的依赖项的情况下,我们无法告诉您哪一个将
slf4j-log4j12
添加到类路径。@SzymonStepniak谢谢-请参阅编辑。你想把你的评论变成一个答案吗?否则我会自己做一个。。。(或者我应该删除/标记为受骗者?@Mikoverent酷,太棒了,我们可以帮你:)
configurations {
    runtime.exclude group: "org.slf4j", module: "slf4j-log4j12"
}