3

我正在尝试将 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 有依赖关系
  • 研究了这个类似的问题null在尝试打印时得到了org.slf4j.spi.LocationAwareLogger,并且org.slf4j.Marker

我希望有人可以对这个问题提供新的见解。谢谢。

4

2 回答 2

4

我敢打赌,您遇到了jar之间的兼容性问题。sl4j尝试检查mvn dependency:tree最终工件的输出。也许你有一些sl4jjar 的两个不同版本,你无法预测哪个首先加载。尝试均衡所有sl4j版本。


OP:请参阅有关我如何解决此问题的文档

于 2013-09-28T22:30:41.473 回答
3

关于madhead答案的信息非常有帮助,但我将记录我为(将)遇到同样问题的其他人所做的事情的细节。

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

  1. 对所有依赖于 的依赖项定义排除项slf4j
  2. 遵循此建议中的选项 2 。
    • 我编写了一个单元测试,它只是 sysout 是我选择的字符串,并在该行定义了一个断点。
    • 然后我将测试作为 JUnit 测试进行调试,并打开 Display 视图
    • 我需要重新运行它,因为Display Result of Evaluating Selected Text最初由于某种原因被禁用。
    • 我发现运行时仍然是指slf4j仍然被添加到类路径中的 1.5.8 版本,无论我是否为它指定了排除项。
  3. 我正在处理的项目依赖于我也在处理的另一个项目(它是一个多 Maven 项目项目),它指定依赖于slf4j-jdk14 1.5.8,所以我只是将其更新为1.6.1.
    • 我必须指定slf4j-apiunder的排除,slf4j-jdk14 1.6.1因为它指的是 1.5.8 版本,并将直接依赖添加到slf4j-api 1.6.1.
于 2013-10-02T09:18:03.700 回答