2

我有一个 Java Maven 项目,其依赖项包括slf4j及其log4j adapter. 我根据http://mvnrepository.com管理 的版本及其最新版本log4j,尤其是1.2.17 的版本远远超过 1.2.12 但我仍然收到错误slf4j-log4j12slf4j-apilog4j

SLF4J: This version of SLF4J requires log4j version 1.2.12 or later. 
    See also http://www.slf4j.org/codes.html#log4j_version 

这对我来说完全不清楚。

我的 Maven 依赖管理如下所示:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.jena</groupId>
            <artifactId>apache-jena-libs</artifactId>
            <type>pom</type>
            <version>2.10.0</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>
    </dependencies>
</dependencyManagement>

我怎样才能摆脱警告?

PS:我也得到一个java.lang.NoSuchMethodError: org.apache.log4j.Logger.isTraceEnabled().

PPS:由于您的评论,我记得该程序有一个“lib”文件夹,该文件夹不包含在 Maven 的类路径中,而是由 Eclipse 本身包含,因此冲突的依赖项必须存在。抱歉,我完全忘记了将 Maven 与 lib 文件夹混合是我的错。我想我必须尝试将尽可能多的库转换为 Maven 依赖项。奇怪的是,即使我编辑“订单和导出”以将 Maven 依赖项放在顶部,问题仍然存在。

4

3 回答 3

6

StaticLoggerBinderslf4j-log4j12 中的代码很早就加载了,它会检查该TRACE级别是否在 log4j 中可用。这是代码:

private StaticLoggerBinder() {
  loggerFactory = new Log4jLoggerFactory();
  try {
    Level level = Level.TRACE;
  } catch (NoSuchFieldError nsfe) {
    Util.report("This version of SLF4J requires log4j version 1.2.12 or later."+
                " See also http://www.slf4j.org/codes.html#log4j_version");
  }
}

这对我来说似乎很密封。

可能是其他一些依赖项正在引入或实际上嵌入了 log4j 的早期版本。一些 * -standalone.jar文件已知会这样做。

在部署时检查您的类路径。您是否在应用服务器中部署?服务器类路径上是否有旧版本的 log4j?在Java认可的路径中?

于 2013-04-12T11:52:24.837 回答
0

将评论更改为回答,因为它似乎可以解决问题。

这是一个类加载器问题,maven 正确构建了它,但缺少依赖项。您可以尝试向 Maven 提供缺少的依赖项吗?否则,我建议您查看 Eclipse 特定的依赖项。

于 2013-04-12T15:29:48.937 回答
0

您应该将<dependency>外部定义<dependencyManagement>如下: -

<dependencyManagement>
    <dependencies>
    ...
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.apache.jena</groupId>
        <artifactId>apache-jena-libs</artifactId>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
    </dependency>
</dependencies>

请参阅依赖机制简介:依赖管理了解更多信息。

我希望这可能会有所帮助。

于 2013-04-12T11:19:54.877 回答