Java 11 中的 ResolutionException

ResolutionException in Java 11

我在 Java 11 开始编写一个新应用程序,而在 运行 应用程序时我遇到了以下错误。我阅读了有关此问题的信息,看起来像是 split package 的情况。但我不确定如何解决这个问题。

java.lang.module.ResolutionException: Modules slf4j.log4j12 and log4j export package org.apache.log4j to module kubernetes.model.common

我在 log4j 和 slf4j 的 pom 中低于依赖项。

log4j

<dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.26</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.26</version>
    </dependency>

log4j2

当我尝试使用具有以下依赖项的 log4j2 时,出现了不同的错误

 <dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-api</artifactId>
  <version>2.7</version>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.7</version>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-slf4j-impl</artifactId>
  <version>2.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.6</version>

java.lang.module.ResolutionException: Modules log4j.core and log4j.api export package org.apache.logging.log4j to module java.annotation

slf4j-log4j12 包含一个名为 org.apache.log4j.MDCFriend 的 class。

我记得这是为了修复 log4j 1.x 中版本检测模式在 Java 9 中更改时发生的错误。自从 Log4j 1.x 在2015 年 8 月,该错误无法修复,因此 SLF4J 引入了这个 "fix"。不幸的是,在 Java 模块系统中禁止在 log4j jar 之外使用 org.apache.log4j 包,这就是导致您看到的问题的原因。

另外,请注意已为 Log4j 1.x 创建了安全漏洞 CVE-2019-17571。虽然您的应用程序可能不会受到该问题的影响,但它会出现在安全扫描中。

您有几个选择:

  1. 针对 SLF4J 创建错误报告并希望它得到修复。
  2. 创建您自己的 slf4j-log4j12 分支并自行修复。
  3. 从 Log4j 1 升级到 Log4j 2(我会为新应用程序推荐的解决方案)。
  4. 使用除 Log4j 2 之外的 SLF4J 实现。

我遇到了同样的错误,但是当我使用 log4j-core version 2.13.3 时,错误消失了。