运行Jetty时,为什么我一直在LocationAwareLogger上获取NoSuchMethodError?

时间:2013-09-28 20:44:50

标签: java maven jetty slf4j

我正在尝试将Jetty服务器嵌入到自动化测试中,因此我在项目中添加了以下依赖项:

<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-servlet</artifactId>
  <version>7.6.13.v20130916</version>
  <scope>test</scope>
</dependency>

我正在使用Jetty 7,因为Web应用程序使用Java 6,Servlet 2.5。

但是当我尝试启动嵌入式Jetty服务器时,我得到:

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.eclipse.jetty.util.log.JettyAwareLogger.log(JettyAwareLogger.java:607)
    at org.eclipse.jetty.util.log.JettyAwareLogger.warn(JettyAwareLogger.java:431)
    at org.eclipse.jetty.util.log.Slf4jLog.warn(Slf4jLog.java:69)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.setFailed(AbstractLifeCycle.java:204)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:74)

我一直试图弄清楚出了什么问题,但到目前为止,我所采取的步骤都没有解决问题。这是我到目前为止所做的一系列清单:

  • 跟踪传递依赖关系以搜索slf4j-api
  • 的不兼容版本
  • 试用不同版本的slf4j-api(1.5.11,1.6.1,1.6.4,1.7.5)
  • 查看了Jetty 7的一些来源,特别是pom.xml,发现它依赖于slf4j 1.6.1
  • 在尝试打印nullorg.slf4j.spi.LocationAwareLogger
  • 时查看this similar question并获得org.slf4j.Marker

我希望有人能够对这个问题提供新的见解。感谢。

2 个答案:

答案 0 :(得分:4)

我打赌你在sl4j罐之间遇到了compatibility problem。尝试检查最终工件的mvn dependency:tree输出。也许你有两个不同版本的sl4j jar,你不能先预测哪些负载。尝试均衡所有sl4j版本。


OP:请参阅documentation on how I resolved this

答案 1 :(得分:3)

关于madheadanswer的信息非常有用,但我将记录我为其他人(将会遇到同样问题)所做的事情的详细信息。

正如上面提到的答案所说,这是slf4j罐子的问题。为了验证我做了以下事情:

  1. 定义对依赖于slf4j的所有依赖项的排除。
  2. 关注this suggestion中的选项2。
    • 我编写了一个单元测试,只是sysout是我选择的String,并在该行定义一个断点。
    • 然后我将测试调试为JUnit测试,并打开显示视图
    • 我需要重新运行它,因为Display Result of Evaluating Selected Text由于某种原因首先被禁用。
    • 我发现运行时仍然引用了slf4j的1.5.8版本仍然被添加到类路径中,无论我是否为其指定了排除。
  3. 我正在开发的项目取决于我正在研究的另一个项目(它是一个多Maven项目项目),它指定了slf4j-jdk14 1.5.8的依赖项,所以我只是将其更新为{{1} }。
    • 我必须在1.6.1下指定排除slf4j-api,因为它指的是版本1.5.8,并将直接相关性添加到slf4j-jdk14 1.6.1