Java 如何在类路径中找到隐藏的jar?

Java 如何在类路径中找到隐藏的jar?,java,eclipse,classpath,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 所以我在谷歌上搜索,发现威奇说: 如果您在Equinox控制

我有一个带有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
所以我在谷歌上搜索,发现威奇说:

如果您在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
org.apache.log4j;version=“1.2.15”
org.apache.velocity_1.5.0.v200905192330[37]导入
我真的不知道那是什么意思。。。但我确信那个罐子不是我应该用的那个

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

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

那么,我如何找到它在哪里呢?它是如何包含在我的项目类路径中的


谢谢你抽出时间

jvm参数'-verbose'或'-verbose:class'将在控制台上为加载它的每个类(在大多数情况下是哪个jar)输出。这可能对您可用(取决于您运行webapp的方式)

对于log4j,请记住,许多人将log4j与他们的jar一起发送。理想情况下,如果他们这样做,他们应该更改包名,但有些人不这样做。我编写/组装了以下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的目录中运行它。

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

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

检查您的WEB-INF/lib文件夹。有时一些东西“神奇地”被放在那里:-)精彩,非常简单。这就是结果:file:/Dvlp/Servers/Tomcat-6.0.33/lib/GroboUtils-5-core.jar现在我真的不明白为什么我在WinXP中没有这个问题(我的同事和Debian都没有)。