2010-03-29 66 views
12

我正在爲已經多模塊的maven項目創建額外的模塊。對於這個我希望所有的東西都像其他模塊(意義上的依賴關係)一樣,只是爲了測試hello world,然後我會去做一些更復雜的東西。當它被部署到jboss服務器上時它確實應該打印hello world,但是我在控制檯上發現了一些奇怪的錯誤,是否有人有類似的經歷?我該如何解決它?那就是:奇怪的jboss控制檯錯誤

15:48:35,789 ERROR [STDERR] log4j:ERROR A "org.jboss.logging.appender.FileAppender" object is not assignable to a "org.apache.log4j.Appender" variable. 
15:48:35,789 ERROR [STDERR] log4j:ERROR The class "org.apache.log4j.Appender" was loaded by 
15:48:35,790 ERROR [STDERR] log4j:ERROR [[email protected]{vfszip:/C:/jboss-5.1.0.GA/server/default/deploy/new-module-0.0.1-SNAPSHOT.war/}] whereas object of type 
15:48:35,790 ERROR [STDERR] log4j:ERROR "org.jboss.logging.appender.FileAppender" was loaded by [[email protected]]. 
15:48:35,790 ERROR [STDERR] log4j:ERROR Could not instantiate appender named "FILE". 

這裏的Appender XML的一部分

http://pastebin.com/X7Dgdrki

回答

16

首先檢查你的<server>/conf/jboss-log4j.xml名爲FILE的附加器的配置(如果你可以在這裏發佈它 - 這可能給我們更多的線索)。

進一步調查發現,org.jboss.logging.appender.FileAppender實際上實現了接口org.apache.log4j.Appender。所以這顯然是一個類加載器衝突。當由兩個不同的類加載器加載時,相同的類定義(在這種情況下爲org.apache.log4j.Appender)被視爲JVM的兩個不同的類。

是否將log4j.jar包含在您的war或您的server/lib目錄中?如果是這樣,你可以嘗試刪除它,看看它是否解決了這個問題。

更新:實際上,最簡單的解決方案是簡單地將appender的類型更改爲jboss-log4j.xml中的org.apache.log4j.FileAppender

關於log4j.jar,我的意思是,如果它出現在你的戰爭中,它(和org.apache.log4j.Appender的副本)被戰爭類加載器(在你的錯誤消息中爲[email protected])加載。這會導致類加載器衝突。所以如果你沒有在你的戰爭中部署log4j.jar,錯誤可能會消失。這隻與Maven相關,因爲在你的pom中配置了依賴關係。對於這個小實驗,你可以簡單地從你的戰爭中手動移除log4j.jar;是否能解決問題,配置log4j的依賴在你的pom作爲「規定」,如:

<dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.12</version> 
     <scope>provided</scope> 
    </dependency> 

如果log4j.jar是不是在你的戰爭,它可能仍然是在服務器/缺省的/ lib目錄下 - 請檢查它,如果它在那裏,請嘗試刪除它。

+0

@彼得Török感謝你的回答我更新了我的問題,我用Maven構建的項目,所以我有一個罐子.. – ant 2010-03-29 08:55:13

+0

@ c0mrade看到我的更新沒有問題。 – 2010-03-29 09:16:15

+1

加入提供的伎倆,你能解釋爲什麼嗎? – ant 2010-03-29 10:24:25

3

我們最近遇到這個問題。我們嘗試了上述建議,但沒有奏效。所以我們通過用抽象日誌記錄接口(我們爲此選擇了org.apache.commons.logging)替換所有log4j導入並從depdenancies中移除log4j來處理了這個問題。那麼會發生什麼呢是實際的底層日誌實現支持JBoss設置的任何東西。如果我們想回到Tomcat(沒有JBoss),我們可以添加log4j jar或任何記錄器實現回戰爭。