2012-04-03 73 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

相關問題