2011-10-11 101 views
1

我與春天有,Hibernate和Struts 2的一個web應用程序,我得到這個錯誤:如何在類路徑中查找隱藏的jar?

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener 
java.lang.NoSuchFieldError: TRACE 

所以我用Google搜索了一下,發現this至極說:

if you are on the Equinox Console, perform the following check: packages org.apache.log4j

,我做到了,並得到了這個:

org.apache.log4j; version="1.2.15"<org.apache.log4j_1.2.15.v201005080500 [33]> 
    org.apache.velocity_1.5.0.v200905192330 [37] imports 

而我真的不知道這意味着什麼......但我敢肯定的是那個罐子不是我應該使用的那個。

事實上,在我刪除項目和Tomcat庫中的所有log4j jar之後,我運行了packages命令

甚至在刪除log4j jar之後,我仍然可以在我的項目的任何類中導入org.apache.log4j.Level類(當然,我可以導入的Level類沒有TRACE字段) 。

那麼,我該如何找到它在哪裏?它如何包含在我的項目類路徑中?

謝謝你的時間!

+0

檢查你的WEB-INF/lib文件夾。有時候「魔法般」的東西會放在那裏:-) –

回答

3

嘗試下面找到導致問題的jar的位置:

System.out.println(org.apache.log4j.Level.class.getProtectionDomain().getCodeSource().getLocation()); 
+0

非常棒,非常簡單。這是什麼出來:文件:/Dvlp/Servers/Tomcat-6.0.33/lib/GroboUtils-5-core.jar現在我真的不明白爲什麼我沒有在WinXP中的這個問題(和我的同事誰與Debian合作)。 –

0

jvm參數'-verbose'或'-verbose:class'將在控制檯上輸出的每個類(大多數情況下是jar)中輸出。可能這是可用的(取決於你如何運行webapp)。

對於log4j記住,許多人用他們的jar發送log4j。理想情況下,他們應該更改包名稱,如果他們這樣做,但有些不這樣做。我寫了/組裝以下的bash腳本找到我用這罈子在它的log4j:

for file in *.jar 
do 
    unzip -l "$file" 2> /dev/null | grep "log4j.dtd" && echo $ 
done 

這看起來對於log4j.dtd我一直在尋找(歡迎隨時與log4j的類來代替),然後打印zip文件中的路徑,以及之後包含它的zip文件的名稱。用你的所有罐子從目錄中運行它。