簡體   English   中英

如何在classpath中找到隱藏的jar?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM