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

时间:2018-02-18 19:45:06

标签: gradle groovy annotations logback slf4j

关于这个主题有几个问题,但我找不到任何与Groovy @Slf4j“AST”注释相关的问题。从表面上讲,这不仅方便,而且还根据日志级别为您提供条件执行。

在我的书“Groovy in Action”中,它说:

  

将Slf4j记录器作为静态最终org.slf4j.Logger注入您的   使用类进行初始化   org.slf4j.LoggerFactory.getLogger(class)。 LogBack框架使用   SLF4J作为底层记录器,因此LogBack用户应该使用@ Slf4j

这就是我正在做的事情。我在gradle.build

中得到了这个
compile 'ch.qos.logback:logback-classic:1.2.1'

...而且我已经找到了一个简单的logback-test.xml。

但是每次我使用这个注释运行测试类,或者直接运行应用程序时,我都会:

  

SLF4J:类路径包含多个SLF4J绑定。 SLF4J:找到了   绑定在[jar:file:/ D:/ apps / ...   fbb0e /的logback经典-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:请参阅http://www.slf4j.org/codes.html#multiple_bindings   说明。
SLF4J:实际绑定类型   [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

...特别是这会“污染”我测试的stderr输出。

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

Jon Skeet是本书的作者之一。是的, THE Jon Skeet。帮助Jon!

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

+--- 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的使用......和here我发现有人想要做到这一点。

2 个答案:

答案 0 :(得分:2)

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

gradle dependencies --configuration runtime

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

知道您必须排除org.slf4j附带的群组log4jorg.apache.odftoolkit:simple-odf:0.8.2-incubating的传递依赖关系。在build.gradle文件中定义此依赖关系,如下所示:

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

答案 1 :(得分:2)

为了兴趣,虽然Szymon Stepniak的解决方案可能是最好的方法,但还有另一种解决方案,我基本上是从this question获得的:

picker-options

...我想这可能有一个好处,就是你不必单独处理每个违规包裹的排除情况......?