【问题标题】:log4j2.xml file being loaded too latelog4j2.xml 文件加载太晚
【发布时间】:2014-08-01 17:32:11
【问题描述】:

我有一个由 maven 生成的 jar,其中包含所有必要的依赖项。在这个 jar 的根目录中,我有 log4j2.xml 配置文件。我使用命令“java -cp myJar.jar myClass”执行 jar。此时我的应用程序将毫无问题地运行,但我会在控制台上得到以下 logj4 错误输出:

log4j:WARN No appenders could be found for logger (myClass).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

有趣的是,我的 log4j2.xml 文件在某些​​时候被解析和使用,因为它将用于记录的文件已创建。只是它似乎在这个过程中被解析和设置得太晚了。

我只包含了 log4j2 依赖项,但我确实有桥梁,以防依赖项使用 log4j。此外,当我在 eclipse 中测试时,这在本地有效。只有当我将它打包到 jar 中时它才会停止工作。

【问题讨论】:

  • 在您的示例中,您的类路径中没有 log4j。
  • Log4j 在我的类路径中,就在 jar 中。正如我提到的,jar 包含所有依赖包。为了添加更多上下文,我删除了所有桥依赖项,发现我的代码正在使用 v1.2 库。通过将它们更改为 2.0 命名空间版本,我从库中获得了预期的输出。这似乎仍然是一种糟糕的行为,因为这些库应该能够做到这一点,所以 v1.2 的东西会被路由到 v2.0。关键问题是“mvn java:exec”和执行由“mvn package”创建的jar,应该功能相同。

标签: java maven logging log4j2


【解决方案1】:

这里的问题是当 Maven 将一个 jar 及其所有依赖项打包在一起时会发生什么。如果有任何重叠的依赖项(即 log4j 和 log4j-1.2-api),则其中一个将被添加到 jar 中,另一个将被排除。这是默默完成的。也与“mvn exec:java”不一致。

要确保 log4j 不是包,您需要检查依赖项并添加

<exclusions>
    <exclusion>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
    </exclusion>
</exclusions>

到每个可能包含 log4j 的依赖项。这将防止它被加载到 jar 中,确保只有 log4j2 会运行。您需要保持警惕,因为任何时候添加依赖项都需要确保它没有 log4j 作为临时依赖项。

最终您应该能够添加全局排除 (http://jira.codehaus.org/browse/MNG-1977?jql=text%20~%20%22global%20exclusion%22),但现在这是您必须做的。

【讨论】:

  • 我同意 Mathflair。上面的错误是由 log4j-1.2 实现产生的。如果你想使用 log4j-1.2 api 但 log4j-2.0 实现,你必须确保 log4j-1.2 jar 不在你的类路径中。
猜你喜欢
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
相关资源
最近更新 更多