与slf4j的绑定错误

时间:2016-06-26 18:01:36

标签: slf4j gate

我正在使用工具,GATE进行文本分析,在安装PR时出现以下错误 -

SLF4J:您的slf4j绑定所请求的版本1.5.6与[1.6,1.7]不兼容

现在,我已经在互联网上搜索了这个并找到了这个 -

 Mixing different versions of slf4j-api.jar and SLF4J binding can cause problems. For example, if you are using slf4j-api-1.7.2.jar, then you should also use slf4j-simple-1.7.2.jar, using slf4j-simple-1.5.5.jar will not work.

我正在使用slf4j-api-1.7.12,但我的计算机上不存在此文件-slf4j-simple-N。 我该如何解决这个问题? 任何帮助将得到赞赏。谢谢!

2 个答案:

答案 0 :(得分:2)

SLF4J是一种标准化的方式来包装&#34; a&#34;真实&#34;记录框架。 (&#34; F&#34;代表&#34; Facade&#34;。)除slf4j-api-<version>.jar文件外,还需要包含&#34; binding&# 34 ;.真正简单的应用程序的一个这样的绑定是slf4j-simple-<version>.jar,它有一些简单的配置,主要用于登录到控制台。但是如果你没有在你的课程路径上有这个,那么那可能不是你正在使用的那个。

那么,您正在使用哪种绑定 ?如果您不确定,那么确定这一点需要您查看类路径中的.jar文件,并查看哪些文件可以作为SLF4J的绑定。绑定库通常以&#34; slf4j - &#34;开头,但有些像&#34; logback&#34;不要直接实施SLF4J API。如果您真的陷入困境,您可能需要查看.jar​​文件(可以使用任何.zip文件阅读器阅读)并查看其中包含org/slf4j文件夹。

我认为您的真正问题在于您使用的任何依赖管理系统,例如Maven,Gradle,或者手动构建带有一堆.jar文件的类路径。看起来您正在使用的任何内容都有slf4j-api文件的多个版本,多个日志记录绑定或slf4j-api的旧版本与新版本的{{1}}不匹配您正在使用的绑定库。查看您正在运行的类路径中的所有.jar文件,您应该能够发现问题。

答案 1 :(得分:2)

编辑: GATE 8.4中不再存在该问题,其中GATE中的类加载确实允许每个插件分离,因此一个插件加载的库不会干扰另一个插件加载的库。

问题

我想,我可以重现这个问题。 当加载两个插件并且每个插件使用不同版本的slf4j-api时,它会在 GATE Developer 中显示出来。例如, Ontology 插件正在使用 slf4j 1.5.6 Stanford_CoreNLP slf4j 1.7.12

尝试创建 Stanford POS Tagger 的新实例时,最终会出现以下错误消息(请参阅下面的完整日志):

  

java.lang.LinkageError:加载器约束违规:解析方法&#34; org.slf4j.impl ...

GATE 8.2 build 5482 started at Mon Jul 04 21:54:09 CEST 2016
and using Java 1.8.0_91 Oracle Corporation on Windows 8.1 amd64 6.3.
CREOLE plugin loaded: file:/C:/Program%20Files/gate-8.2-build5482-BIN/plugins/Stanford_CoreNLP/
CREOLE plugin loaded: file:/C:/Program%20Files/gate-8.2-build5482-BIN/plugins/Ontology/
org.xml.sax.helpers.DefaultHandler is available via both the system classpath and a plugin; the plugin classes will be ignored
SLF4J: The requested version 1.5.6 by your slf4j binding is not compatible with [1.6, 1.7]
SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details.
java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of gate/util/GateClassLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of gate/util/GateClassLoader) for the method's defining class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type org/slf4j/ILoggerFactory used in the signature
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:335)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:283)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:304)
    at edu.stanford.nlp.io.IOUtils.<clinit>(IOUtils.java:42)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.readModelAndInit(MaxentTagger.java:765)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.<init>(MaxentTagger.java:298)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.<init>(MaxentTagger.java:263)
    at gate.stanford.Tagger.init(Tagger.java:129)
    at gate.Factory.createResource(Factory.java:432)
    at gate.gui.NewResourceDialog$4.run(NewResourceDialog.java:270)
    at java.lang.Thread.run(Unknown Source)

解决方案

我能想到三种可能的解决方案:

1)消除不必要的插件

你真的需要两个插件与slf4j的不兼容版本?如果没有,只需卸载您不需要的插件(确保重启GATE),问题应该消失。

2)防止加载 ONE 插件的slf4j jar

这比下一个解决方案更脏一点(因为修改后的插件不会单独工作)但它应该足以作为快速修复。选择其中一个插件并从插件的creole.xml文件中删除slf4j条目。再次,GATE重启后问题应该消失了。

Ontology 插件非常简单:(注意注释掉的行)

<?xml version="1.0"?>
<CREOLE-DIRECTORY> 
      <JAR>lib/commons-httpclient-3.1.jar</JAR>
      <JAR>lib/owlim-lite-5.4.jar</JAR>
<!--  <JAR>lib/slf4j-api-1.5.6.jar</JAR>
      <JAR>lib/slf4j-jdk14-1.5.6.jar</JAR> -->
      <JAR>lib/openrdf-sesame-2.7.9-onejar.jar</JAR>
      <JAR SCAN="true">Ontology.jar</JAR>
</CREOLE-DIRECTORY>

对于 Stanford_CoreNLP 插件,它更复杂,因为它使用 Apache Ivy 加载slf4j jar并且必须将它们排除在ivy.xml文件中( plugins\Stanford_CoreNLP\build\ivy.xml,请注意文件底部添加的行<exclude org="org.slf4j"/>

<ivy-module version="2.0">

  <info
    organisation="uk.ac.gate.plugins"
    module="stanford_corenlp"
    revision="8.2-SNAPSHOT">
    <description homepage="https://github.com/GateNLP/gateplugin-Stanford_CoreNLP/" />
  </info>

  <configurations>
    <conf name="default" />
  </configurations>

  <dependencies defaultconf="*->master(default),runtime(default)" >
    <dependency org="edu.stanford.nlp" name="stanford-corenlp" rev="3.6.0" />
    <exclude org="org.slf4j"/>
  </dependencies>
</ivy-module>

3)统一冲突的slf4j版本

这似乎是一个干净的解决方案,但它比我预期的要复杂得多,因为即使在两个插件都使用相同版本的slf4j之后问题仍然存在。这个问题可能更深层次于GATE类加载机制,而且只有#34;为我工作的方式&#34;如何统一slf4j版本是为了在所有冲突的插件中排除它们,并将slf4j jar(例如来自Ontology插件的那些)添加到GATE的lib文件夹中。