从可执行jar运行应用程序时“log4j:WARN没有找到appender”错误但在IntelliJ中运行它时没有错误

时间:2017-05-23 18:54:28

标签: java log4j

我正在使用 log4j2 ,但我的一些依赖项使用log4j。当我从可执行jar文件运行应用程序时,我只得到几行日志行和以下消息:

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

但是当我在IntelliJ中运行应用程序时,它按预期工作,没有警告和所有日志生成

我使用maven enforcer来禁止log4j。我也尝试添加依赖项,但将范围设置为“提供”。

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>[0.0,1.2.17)</version>
  <scope>provided</scope>
</dependency>

我也使用单个版本号而不是范围来完成上述操作。所有这些都适用于在IntelliJ中运行但当应用程序作为可执行jar运行时它们都不起作用。

问题https://github.com/react-community/react-navigation/issues/571#issuecomment-284207331的答案会提示我收到此错误消息,因为log4j以某种方式蔓延到我的jar中,我似乎无法阻止它。

如何解决这个问题的任何建议将不胜感激。感谢。

请注意我使用的是log4j2和以下依赖项

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.25</version>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-api</artifactId>
  <version>2.8.2</version>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.8.2</version>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-slf4j-impl</artifactId>
  <version>2.8.2</version>
  <type>pom</type>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-1.2-api</artifactId>
  <version>2.8.2</version>
</dependency> 

1 个答案:

答案 0 :(得分:0)

我使用以下Maven命令来查找log4j中的依赖项。

mvn dependency:tree -Dincludes=log4j:log4j

事实证明,log4j是由Maven插件(maven-hyperjaxb3-plugin)引入的,并且由于某些原因maven-enforcer-plugin没有阻止它。当我在IntelliJ中运行应用程序时,插件没有被触发,因此依赖项没有包含在类路径中,但是当编译成可执行jar时,它仍然被拉入。

此常见问题解答http://logging.apache.org/log4j/2.x/faq.html#which_jars以及此问题Configuring log4j2 and log4j using a single log4j2 xml file的答案非常有用。

就这么清楚,问题是log4j正在进入jar,如果你打算使用log4j2,log4j不能包含在类路径中。