繁体   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