在Eclipse RCP插件中存在多个slf4j绑定

10

我有一个简单的Eclipse插件,在激活时出现以下错误:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [bundleresource://103.fwk8918249:1/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [bundleresource://103.fwk8918249:4/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

这两个URL都解析到捆绑包中完全相同的jar文件

libs/slf4j-log4j12.jar!/org/slf4j/impl/StaticLoggerBinder.class
  • 我该如何解决这个问题?
  • 为什么捆绑包会加载两次(“:1”和“:4”)?
3个回答

5

如果在您的项目类路径(JDT .classpath文件)和MANIFEST.MF文件中都定义了SLF4J绑定,则会出现此结果。

您应该从项目的类路径中删除SLF4J绑定:

YourProject → 属性 → Java Build Path → Libraries

  • 选择SLF4J Binding JAR并点击“移除”。

这样做后,您的类加载器中只应有一个对SLF4J绑定的引用(因此错误消息不应再出现)。


3

对于我来说,问题是由于安装的插件引起的。要找出是哪一个插件,请查看调试Eclipse实例的元数据中的SavedExternalPluginList.txt文件,例如:

runtime-EclipseApplication\.metadata\.plugins\org.eclipse.pde.core\SavedExternalPluginList.txt

并搜索 slf4j。这样你就可以了解哪些插件可能负责。我找到以下条目:

file:/D:/EclipseJava/App/Eclipse/plugins/ch.qos.logback.slf4j_1.0.7.v201505121915.jar

file:/D:/EclipseJava/App/Eclipse/plugins/org.eclipse.m2e.maven.runtime.slf4j.simple_1.7.0.20160603-1931/

file:/D:/EclipseJava/App/Eclipse/plugins/org.slf4j.api_1.7.2.v20121108-1250.jar
file:/D:/EclipseJava/App/Eclipse/plugins/org.slf4j.impl.log4j12_1.7.2.v20131105-2200.jar

禁用我的目标平台上的插件ch.qos.logback.slf4j就解决了问题:
enter image description here
如果您手动更改插件选择,请小心使用“验证插件”功能,以确保不会创建其他问题。

文件SavedExternalPluginList.txt位于“调试”Eclipse的工作区中。感谢指出此文件。 - jantje

0

这并不能解决问题,因为我不使用Maven来构建类路径。此外,在这个问题中有两个不同的JAR文件(1.6.1和1.6.4),我的问题是同一个JAR文件在类路径上出现了两次。 - Absurd-Mind
bundlesource协议使用“端口号”来区分不同的JAR包。在您的情况下,这将是包含org/slf4j/impl/StaticLoggerBinder.class的jar 1和4。 您的应用程序中是否有其他slf5j/logback/someotherlogger jar? - Calon
该捆绑包包含4个JAR文件在运行时类路径中,分别是slf4j-api、log4j、slf4j-log4j12和一个带有一些内部辅助类的JAR文件。端口1和4都解析到slf4j-log4j12.jar。使用FileLocator进行测试。 - Absurd-Mind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接