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.LocationAwareLogger
, org.apache.commons.logging.impl.SLF4JLocationAwareLog
和org.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-core
, Maven-core-2.2.1
使用jcl-over-slf4j: 1.5.6
。 Maven-core
是一个父级jar。
现在,由于这个JCL
jar,我正面临着这个问题。 因此我将它从weblogic
的lib
文件夹(或您可能使用的任何服务器)中删除。
和啊! 问题解决了。
注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