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

时间:2011-10-11 13:30:02

标签: java eclipse 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搜索,发现this说:

  

如果您在Equinox控制台上,请执行以下检查:   包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

而我真的不知道这意味着什么......但我确定的是,jar不是我应该使用的那个。

事实上,在我删除项目和Tomcat库中的所有log4j jar后,我运行了packages命令

即使在删除log4j jar后,我仍然可以在我的项目中的任何类中导入org.apache.log4j.Level类(当然,我可以导入的Level类没有TRACE字段)。

那么,我该如何找到它的位置?它是如何包含在我的项目类路径???

中的

感谢您的时间!

2 个答案:

答案 0 :(得分:3)

请尝试以下方法查找导致问题的jar位置:

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

答案 1 :(得分:0)

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文件的名称。只需从包含所有罐子的目录中运行它。