[英]How to find hidden jar in classpath?
我有一個帶有Spring,Hibernate和Struts 2的Web應用程序,但出現此錯誤:
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
java.lang.NoSuchFieldError: TRACE
所以我用Google搜索了一下,發現這個至極說:
如果您在Equinox控制台上,請執行以下檢查: package 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字段)。
那么,我如何找到它在哪里? 以及它如何包含在我的項目類路徑中?
感謝您的時間!
嘗試按照以下步驟查找引起問題的罐子的位置:
System.out.println(org.apache.log4j.Level.class.getProtectionDomain().getCodeSource().getLocation());
jvm參數'-verbose'或'-verbose:class'將在控制台上為從中加載它的每個類輸出(在大多數情況下為jar)。 您可能可以使用此功能(取決於您運行Webapp的方式)。
對於log4j,請記住,許多人將jar隨帶了log4j。 理想情況下,如果這樣做,他們應該更改軟件包名稱,但有些則不要。 我編寫/匯編了以下bash腳本,以查找我使用的jar中包含log4j的腳本:
for file in *.jar
do
unzip -l "$file" 2> /dev/null | grep "log4j.dtd" && echo $
done
這會查找我一直在尋找的log4j.dtd(可以用任何log4j類隨意替換),然后在zip文件中打印路徑,並在其中打印包含該路徑的zip文件的名稱。 只需從您所有jar的目錄中運行它即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.