【问题标题】:Empty maven project with SLF4J reference has log4j "No appenders could be found" warning带有 SLF4J 参考的空 maven 项目具有 log4j“找不到附加程序”警告
【发布时间】:2013-02-19 00:27:00
【问题描述】:

这个问题似乎与Using Logback but Log4j started displaying WARN no Appenders 有关,但那里的答案似乎并不能解决我的问题。

当我创建一个除了 slf4j 之外没有依赖项的 maven 项目时,我收到一个警告:

log4j:WARN No appenders could be found for logger (com.example.App).
log4j:WARN Please initialize the log4j system properly.

步骤:

在空目录下执行

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart

Define value for property 'groupId': : com.example
Define value for property 'artifactId': : slf4jtest
Define value for property 'version':  1.0-SNAPSHOT: : 
Define value for property 'package':  com.example: : 

将 SLF4J 添加到 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>slf4jtest</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>slf4jtest</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.7.2</version>
      </dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.2</version>
</dependency>
  </dependencies>
</project>

在 App.java 中调用记录器

package com.example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        Logger logger = LoggerFactory.getLogger(App.class);
        logger.debug("hello");
        System.out.println( "Hello World!" );
    }
}

执行:

mvn package

执行:

mvn exec:java -Dexec.mainClass="com.example.App"

输出:

log4j:WARN No appenders could be found for logger (com.example.App).
log4j:WARN Please initialize the log4j system properly.
Hello World!

log4j 未列为依赖项:

$ mvn dependency:tree
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building slf4jtest 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ slf4jtest ---
[INFO] com.example:slf4jtest:jar:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:3.8.1:test
[INFO] \- org.slf4j:slf4j-api:jar:1.7.2:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.872s
[INFO] Finished at: Tue Feb 19 11:23:33 EST 2013
[INFO] Final Memory: 5M/81M
[INFO] ------------------------------------------------------------------------

【问题讨论】:

    标签: macos maven log4j slf4j


    【解决方案1】:

    所以我没有意识到 Mac OS X 在 /Library/Java/Extensions 下预装了 log4j 和 slf4j...我通过运行以下命令发现了这一点:

    java -verbose:class -cp ~/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar:~/.m2/repository/org/slf4j/slf4j-api/1.7.2/slf4j-api-1.7.2.jar:./target/classes com/example/App
    

    ...并发现(在许多其他类中)这些类被加载和使用,而不是我通过 maven 包含的类。

    /Library/Java/Extensions/log4j-1.2.15.jar
    /Library/Java/Extensions/slf4j-log4j12-1.5.8.jar
    /Library/Java/Extensions/slf4j-api-1.5.8.jar
    

    不确定该问题的“正确”解决方案是什么,但从该目录中删除所有这些文件似乎可以解决问题。

    【讨论】:

    • 非常有趣。 "Java Development Guide for Mac" 似乎暗示这个目录是供用户添加库的。您确定您或其他人没有在某个时候将它们放在那里,甚至可能是偶然的吗?对于 OS X 来说,默认情况下带有那些似乎是完全疯狂的。
    • @RyanStewart,看起来确实很疯狂......我不记得添加了这些库。我是这台电脑的唯一用户。也许它们是与其他应用程序一起安装的,尽管这看起来很糟糕。
    • Google 发现 geniuswiki.com/… 说它包含在 OSX 中,但 issues.gradle.org/browse/GRADLE-1451 说它们带有 AUSKey,我过去安装过 - 所以不是 100% 肯定。
    • 非常感谢 - 我有一堆阻止 maven 输出的 AUSKey 东西。将这些文件移动到备份位置修复了我的 log4j:WARN 问题。
    【解决方案2】:

    无法复制。我得到了预期的 SLF4J 绑定失败:

    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
    Hello World!
    

    我的依赖树看起来和你的一样:

    [INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ slf4jtest ---
    [INFO] com.example:slf4jtest:jar:1.0-SNAPSHOT
    [INFO] +- junit:junit:jar:3.8.1:test
    [INFO] \- org.slf4j:slf4j-api:jar:1.7.2:compile
    [INFO] ------------------------------------------------------------------------
    

    系统信息:

    $ mvn -version
    Apache Maven 3.0.4 (r1232337; 2012-01-17 02:44:56-0600)
    Maven home: d:\dev\tools\maven
    Java version: 1.7.0_03, vendor: Oracle Corporation
    Java home: d:\dev\tools\java\jre
    Default locale: en_US, platform encoding: Cp1252
    OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 2018-03-21
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多