我正在使用 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>
答案 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不能包含在类路径中。