【问题标题】:How to find hidden jar in classpath?如何在类路径中找到隐藏的 jar?
【发布时间】:2011-10-11 13:30:01
【问题描述】:

我有一个带有 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

所以我用谷歌搜索,发现this wich 说:

如果您在 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

我真的不知道这意味着什么……但我可以肯定的是,那个罐子不是我应该使用的罐子。

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

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

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

感谢您的宝贵时间!

【问题讨论】:

  • 检查您的 WEB-INF/lib 文件夹。有时“神奇”的东西会放在那里:-)

标签: java eclipse classpath


【解决方案1】:

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

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

【讨论】:

  • 太棒了,真的很简单。这就是结果:file:/Dvlp/Servers/Tomcat-6.0.33/lib/GroboUtils-5-core.jar 现在我真的不明白为什么我在 WinXP 中没有这个问题(我的同事也没有使用 Debian 的人)。
【解决方案2】:

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

对于 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 的目录中运行它即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2013-03-03
    相关资源
    最近更新 更多