LocationAwareLogger上的SLF4J NoSuchMethodError

这个问题之前已被提出过,但不幸的是,似乎没有任何解决方案对我有用。 我正面临这个exception(使用精简堆栈跟踪):

java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V at org.apache.commons.logging.impl.SLF4JLocationAwareLog.debug(SLF4JLocationAwareLog.java:133) at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:221) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:401) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) 

使用命令行Maven进行编译时以及部署到Tomcat时会发生这种情况。 它在IntelliJ IDEA中工作正常。

通常我希望这是由正在使用的SLF4J库的多个版本引起的。 但Maven依赖树在单个版本中显示所有slf4j库:

 ..$ mvn dependency:tree | grep slf4j [INFO] +- org.slf4j:slf4j-simple:jar:1.6.4:compile [INFO] | \- org.slf4j:slf4j-api:jar:1.6.4:compile [INFO] +- org.slf4j:slf4j-api:jar:1.6.4:compile [INFO] +- org.slf4j:jcl-over-slf4j:jar:1.6.4:compile [INFO] +- org.slf4j:slf4j-simple:jar:1.6.4:compile 

我甚至确保〜/ .m2 / repository中没有其他JAR

也没有对commons-logging库的引用(我将它们全部排除在外,因为依赖树已经确认了。

我该如何解决这个问题? 我的想法已经不多了。

编辑:这里要求完全依赖,首先是父POM:

    org.hibernate hibernate-validator ${org.hibernate.validator.version}    org.slf4j slf4j-api     org.hibernate hibernate-validator-annotation-processor ${org.hibernate.validator.version}   javax.validation validation-api 1.0.0.GA   org.springframework spring-context ${org.springframework.version}    commons-logging commons-logging     org.springframework spring-webmvc ${org.springframework.version}   org.springframework.security spring-security-config ${org.springframework.version}   org.springframework.security spring-security-core ${org.springframework.version}   org.springframework.security spring-security-web ${org.springframework.version}   org.springframework.security spring-security-taglibs ${org.springframework.version}   javax.inject javax.inject 1   junit junit 4.8.2   org.slf4j ${org.slf4j.backend} ${org.slf4j.version}   org.hsqldb hsqldb 2.2.4   org.apache.httpcomponents httpclient 4.1.2   joda-time joda-time 2.0   joda-time joda-time-jsptags 1.0.2   javax.servlet servlet-api 2.5   javax.servlet.jsp jsp-api 2.1   javax.servlet jstl 1.2   postgresql postgresql 9.0-801.jdbc4   org.apache.commons commons-lang3 3.0.1    

然后是失败的模块:

  // client specific dependencies skipped //  com.google.guava guava 10.0.1    org.springframework spring-context    commons-logging commons-logging     org.springframework spring-webmvc   org.springframework.security spring-security-config runtime   org.springframework.security spring-security-core compile   org.springframework.security spring-security-web compile   org.springframework.security spring-security-taglibs runtime   javax.inject javax.inject   cglib cglib 2.2.2    net.sf.opencsv opencsv 2.0   org.slf4j slf4j-api ${org.slf4j.version}   org.slf4j jcl-over-slf4j ${org.slf4j.version} runtime   org.slf4j ${org.slf4j.backend} ${org.slf4j.version} runtime   log4j log4j 1.2.16    joda-time joda-time   joda-time joda-time-jsptags runtime    javax.servlet servlet-api provided   javax.servlet.jsp jsp-api provided   javax.servlet jstl   com.google.visualization visualization-datasource 1.0.2   org.mybatis mybatis-spring 1.0.2   commons-dbcp commons-dbcp 1.4   org.codehaus.jackson jackson-mapper-asl 1.9.0   commons-io commons-io 2.1   commons-fileupload commons-fileupload 1.2.2   org.apache.poi poi 3.7   org.apache.poi poi-ooxml 3.7   org.apache.poi poi-ooxml-schemas 3.7   postgresql postgresql runtime   test junit junit   

这些是在父级上设置的属性:

  UTF-8 4.2.0.Final slf4j-simple 1.6.4 3.0.5.RELEASE  

鉴于我最近的实验,它似乎并不是与项目文件有关的问题。 我试图’hg bisect’这个问题,但回到几周我找不到一个有效的版本。 其中一些在生产系统中运行,因此不太可能是导致此问题的代码更改。

NoSuchMethodError的javadoc说,

通常,编译器会捕获此错误; 如果类的定义不兼容地更改,则此错误只能在运行时发生。

所以这可能是由于加载的slf4j版本不兼容造成的。 而不是查看您的类路径并猜测加载类的位置,而不是像这里描述的那样找到加载类的位置。

打印出正在加载org.slf4j.spi.LocationAwareLoggerorg.apache.commons.logging.impl.SLF4JLocationAwareLogorg.slf4j.Marker位置。

一解决方案。

在eclipse目录中validation:configuration \ org.eclipse.equinox.simpleconfigurator \ bundles.info

slf4j不再一个

mvn clean依赖:tree -DskipTests;

删除“org.slf4j”的所有依赖项,除了一个(最高的一个“)

   org.apache.maven.plugins maven-jar-plugin 2.6   org.slf4j slf4j-jdk14   org.slf4j jcl-over-slf4j    

我们遇到了类似的问题,结果发现我们在类路径中有两个不兼容的slf4j jar版本。 类路径具有以下2个不兼容的版本。 从类路径中删除较低版本后,问题得到解决。

SLF4J-API-1.6.1.jar
SLF4J-log4j12-1.6.1.jar

SLF4J-API 1.5.11.jar
SLF4J-log4j12-1.5.11.jar

我的pom文件中有石英调度程序,其中包括slf4j,所以我将其排除在外:

  org.slf4j slf4j-api  

并且工作了!

解决了 !!!

我依赖于另一个使用JavaDoc插件的项目。 JavaDoc插件内部使用Maven-coreMaven-core-2.2.1使用jcl-over-slf4j: 1.5.6Maven-core是一个父级jar。

现在,由于这个JCL jar,我正面临着这个问题。 因此我将它从weblogiclib文件夹(或您可能使用的任何服务器)中删除。

和啊! 问题解决了。

注1: – 您还可以使用Maven的标记从JavaDoc (或任何其他插件)中删除此依赖项以解决此问题。

注2: – 使用POM中的Dependency Hierarchy选项卡查看是否存在任何此类旧SLF4J jar。 并删除rest,只保留一个版本。

希望能帮助到你 ..

当您具有使用相同传递依赖性的依赖项时,通常会发生这种情况。 这意味着您的2个依赖项(或您的应用程序和传递依赖项)都在内部使用不同版本的SLF4J。 但是你的应用程序只能同时使用该类的单个版本,因此必须选择(不知道这里的规则……随机吗?)

要解决这个问题,你通常需要做一个mvn dependency:tree来查看哪些是使用不同版本的SLF4J。

添加此依赖项为我解决了这个问题

  org.slf4j slf4j-api 1.7.25   org.slf4j slf4j-log4j12 1.7.5