我有一个使用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字段)。
那么,我该如何找到它的位置?它是如何包含在我的项目类路径???
中的感谢您的时间!
答案 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文件的名称。只需从包含所有罐子的目录中运行它。