加载所需依赖项后无法加载 class "org.slf4j.impl.StaticLoggerBinder"

Failed to load class "org.slf4j.impl.StaticLoggerBinder" after loading required dependencies

我正在构建我的 Maven 项目并在码头服务器中部署,但我遇到了这个问题。在我的 ${jetty_home}/lib 中,我有 jcl-over-slf4j-1.7.2.jar, jul-to-slf4j-1.7.2.jar, slf4j-api-1.7.2.jar。除了我的 Maven 项目,我还有

<dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.2</version>
            <scope>provided</scope>
        </dependency>

在 mvn 依赖树中,对于 slf4j,我看到以下内容:

[INFO] +- org.slf4j:slf4j-log4j12:jar:1.7.2:compile
[INFO] |  \- log4j:log4j:jar:1.2.17:compile
[INFO] +- org.slf4j:slf4j-api:jar:1.7.2:provided (scope not updated to compile)

除此之外,我还有 commons-logging-1.2.jar 与我的项目捆绑在一起。现在我构建我的 maven 项目,如果我 运行 使用我的 eclipse jetty 插件,我没有任何问题,并且一切正常。 之后,我尝试将它部署在远程服务器的 jetty webapp 文件夹中,现在我得到了,

Establishing start.log on Wed Jul 08 12:46:13 PDT 2015
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

我已经按照其他帖子中提到的步骤进行操作,但仍然无法解决这个问题。请帮忙。谢谢。

您将 SLF API 放入错误的 class 加载程序中。

Class 加载器层次结构看起来像这样(可能有点不准确):

BootstrapClassLoader - loads Java classes
   ^
   |
ExtClassLoader - loads some additional libs
   ^
   |
AppClassLoader - loads Jetty and slf4j-api
   ^
   |
WebAppClassLoader - loads your application and can load slf4j-impl

你的 classes 触发加载 slf4j-api 包,这导致从 WebAppClassLoaderAppClassLoader 的委派。然后 slf4j-api classes 将尝试加载 slf4j-impl classes,但只会为它们请求 AppClassLoader。此 class 加载程序无法委托给您的应用程序 class 加载程序(即图中的委托)。它只委托并没有找到任何东西,因此错误。

您必须将这些库放在同一个 class 加载程序中。在 jetty/lib 或 WAR.