2012-04-03 49 views
4

未初始化运行码头 - Maven的插件,当我得到这个错误:SLF4J/Log4J的在码头,Maven的插件

[INFO] --- jetty-maven-plugin:7.6.1.v20120215:start (start-jetty) @ rest --- 
log4j:WARN No appenders could be found for logger (org.eclipse.jetty.util.log). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

该项目是包含在WEB-INF/classes log4j.properties的战争。

我也传递了以下属性给插件,只是为了看到发生了什么事情的缘故(即特定的log4j.properties文件中的位置存在以下为好):

<!-- Log4J settings --> 
<systemProperty> 
    <name>log4j.configuration</name> 
    <value>file://${project.build.testOutputDirectory}/log4j.properties</value> 
</systemProperty> 
<systemProperty> 
    <name>log4j.debug</name> 
</systemProperty> 

测井在webapp中工作正常。但是,我对这个错误感到困惑。

我在项目中的这些依赖关系:

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>jcl-over-slf4j</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-core</artifactId> 
</dependency> 

此外,当(这需要码头)测试开始运行,我看到下面的输出:

log4j: Using URL [file:/project/foo/rest/target/test-classes/log4j.properties] for automatic log4j configuration. 
log4j: Reading configuration from URL file:/project/foo/rest/target/test-classes/log4j.properties 
log4j: Parsing for [root] with value=[ERROR, console]. 
log4j: Level token is [ERROR]. 
log4j: Category root set to ERROR 
log4j: Parsing appender named "console". 
log4j: Parsing layout options for "console". 
log4j: Setting property [conversionPattern] to [%d %p %c - %m%n]. 
log4j: End of parsing for "console". 
log4j: Parsed "console" options. 
log4j: Parsing for [project.foo] with value=[DEBUG]. 
log4j: Level token is [DEBUG]. 
log4j: Category project.foo set to DEBUG 
log4j: Handling log4j.additivity.project.foo=[null] 
log4j: Finished configuring. 

有人能告诉我为什么码头不满?

回答

5

另一种方法是使用“文件:///”如下风格的URL为log4j.properties:

<plugin> 
    <groupId>org.mortbay.jetty</groupId> 
    <artifactId>jetty-maven-plugin</artifactId> 
    <version>8.1.10.v20130312</version> 
    <configuration> 
    <systemProperties> 
      <systemProperty> 
       <name>log4j.configuration</name> 
       <!-- have to use file:/// url since --> 
        <!-- Jetty is using classloader --> 
        <!-- before the webapp classloader is ready --> 
       <value>file:///${basedir}/src/main/resources/log4j.properties</value> 
      </systemProperty> 
    <configuration> 
    <dependencies> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-log4j12</artifactId> 
      <version>1.6.6</version> 
     </dependency> 
    </dependencies> 
</plugin> 

我有地方码头使用一个类加载器寻找log4j.properties文件同样的问题这不包括我的项目的源代码。所以它一直在抱怨“log4j:WARN没有appender可以找到记录器(org.eclipse.jetty.util.log)。”。但是这个解决方法解决了它,我能够看到日志消息并通过log4j控制它们。

1

问题是我有一个聚合器和几个模块,每个模块在测试之前启动Jetty,然后停止它。在启动Jetty时,我已定义了<systemProperties/>。看看Jetty的源代码后,我发现一旦系统属性从其中一个模块被设置,它们将不会在稍后(在其他模块中)被重写,因为插件中有一条禁止这样做的规则。因此,日志的系统属性在执行之间变得混乱,尽管它们在不同的子模块中。

我通过编写自己的Maven插件来解决这个问题,该插件在执行前为您设置了系统属性。我已经把项目here放在github中。解释如何使用它可以找到here

+0

谢谢你的解决方案;你的插件没有为我工作,但我能够使用属性maven插件(http://mojo.codehaus.org/properties-maven-plugin)的set-system-properties目标来完成同样的事情。 – piepera 2012-05-18 13:02:43

+0

我实际上已经向这里的Jetty提交了一个bug: https://jira.codehaus.org/browse/JETTY-1507。 基本上,插件不会覆盖任何已经存在的系统属性。我必须找到这个难题。这真的不是预期的行为。如果你喜欢,你可以投票支持票。 – carlspring 2012-05-18 14:44:05

4

this message board thread所示,您不能使用jetty-maven-plugin中的系统属性配置log4j。截至Jetty 7.5.0,Jetty类现在使用静态 日志初始值设定项。这些静态日志初始化程序会导致在加载系统属性之前初始化Log4j系统。

两种可能的解决方法是降级到Jetty 7.4.5,或者在初始化Jetty插件之前使用单独的maven插件(如properties-maven-plugin)设置log4j系统属性。

+0

谢谢。谢谢。谢谢。我一直在努力处理系统属性和8.x Jetty插件。我读过这么多帖子,但这是第一个有效的。 – ksclarke 2012-11-24 05:22:01

相关问题