java - 如何在 Eclipse 中的 Tomcat 中使用导致 InvalidJarIndexException 的损坏的 JAR 索引来追踪 JAR

标签 java eclipse tomcat jar rhel5

我正在开发一个应用程序,其中包含许多 servlet。我使用的开发环境是 Eclipse(3.2.1,它很旧),我在其中运行 Tomcat 服务器(5.5.23,也很旧),使用 Eclipse Tomcat Wrapper 插件来完成任务。所有这些都运行在 RedHat 5.2 Linux 系统上。

我使用的 Java 运行时是 JDK 1.6.0(21),我最近升级到(从以前的 JDK 1.5 版本),据我所知,上面的软件组合(连同我正在使用的应用程序) ) 确实有效:我可以启动 Tomcat 服务器,它启动时没有错误或提示,并且应用程序的 servlet 在端口 8080 上可用。

但是,某处发生了变化(可能在应用程序 jarfile 本身中,我怀疑主机上的所有内容都是导致此问题的根本原因)。现在,当我尝试启动 Tomcat 服务器时,控制台输出中出现错误 sun.misc.InvalidJarIndexException。这发生在以下类和方法中:

  • org.apache.commons.modeler.Registry registerComponent(发生 3 次)
  • org.apache.catalina.core.StandardServer initialize(发生一次)
  • org.apache.catalina.connector.Connector start(发生两次)

  • 我确实发现 this stack overflow question regarding how to find the JAR of a Java Class 很有用,并且我确实运行了几次 find /usr -name \*name-of-suspected-jar\*.jar 以追踪一些建议的违规 JARS。我还尝试在 Eclipse 中检查 Tomcat 服务器的运行时配置,但确实无法将系统上的 JAR 文件与 Tomcat 运行时设置的 CLASSPATH(或启动 Eclipse 时环境中使用的 CLASSPATH)匹配。这项工作可能需要我更加严格,但在这样做之前(这就是为什么我现在不在这里发布有关 CLASSPATH 的所有血腥细节的原因),我仔细阅读了 InvalidJarIndexException 的真正含义。

    因此,JAR 文件可能包含一个可选的 INDEX.LIST 文件,该文件包含有关要在 JAR 文件中查找哪些类(和方法?)的信息。这个想法是在 CLASSPATH 中的所有 JARS 中短路搜索,这在许多情况下都很有用。问题是当 INDEX.LIST 文件碰巧损坏(或被认为损坏)时,会导致类的加载完全放弃(类加载器不会回退到搜索 CLASSPATH 中的所有 JAR)并且要抛出错误 InvalidJarIndexException。更麻烦的是,搜索 JAR 的顺序可能会影响类加载器处理 INDEX.LIST 文件的方式:一个 JAR 的 INDEX.LIST 文件可能引用其他 JARS,如果引用的 JARS 与第一个 JAR 的 INDEX.LIST 不同步文件,类加载器失败并出现此 InvalidJarIndexException 错误。

    因此(根据 this StackOverflow 问题),似乎可以抛出此错误不仅是因为 JAR 文件具有损坏的 INDEX.LIST ,即使 JAR 具有有效的 INDEX.LIST 或合法地缺少,它似乎甚至可以在 JAR 上抛出INDEX.LIST 仅仅是因为先前搜索的 JAR 混淆了类加载器。 (换句话说,由于系统上其他地方的违规者,即使对于“无辜的”未损坏的 JAR 文件,也可能抛出此异常)。

    所以,在写完一本小说之后,我的主要问题来了:
  • 追踪每个 .jar 被抛出的精确 InvalidJarIndexException 文件的最佳方法是什么?
  • 检查随机选择的 .jar 文件是否具有 INDEX.LIST 文件的最佳方法是什么,如果是,则该文件是否有效(即未损坏)?有哪些工具可用于此任务?
  • 有没有有效的方法可以自动推导出.jar文件的搜索顺序?我可以尝试手动跟踪 CLASSPATH,但老实说,这很容易出错且乏味。
  • 有没有一种有效的方法来找出搜索顺序中的 .jar 文件,这可能会混淆类加载器,以便稍后在搜索中指责无辜的、未损坏的 .jar 文件具有不正确的 INDEX.LIST 文件?

  • 免责声明:我知道我运行的是旧版本的软件(即使我安装了 Redhat 5.2 的最新更新)而且我知道很多人的下意识 react 是建议我不要在调试这个方面付出任何努力而是升级到更新版本的 Tomcat、Eclipse 和 Linux(虽然 Java 是最近的)。我不想这样做的原因是,在调查之后,我发现进行升级或尝试在我今天使用的 RHEL5.2 提供的 Tomcat/Eclipse 旁边安装一个单独的现代 Tomcat 或 Eclipse 相当麻烦。此外,我认为这种故障​​排除是学习有关 Java 及其相关工具和功能的一些有用的基本细节的机会。弄清楚类加载是如何工作的以及是什么导致它在我的系统上抛出这个 InvalidJarIndexException 将非常有教育意义!

    (但如果此故障排除失败,我会认真考虑使用现代 Linux、Eclipse 和 Tomcat...我保证)

    最佳答案

    采取以下步骤来诊断问题:

  • 在 Eclipse 中添加一个异常断点(它是带有
    感叹号图标),并将其设置为停止捕获和未捕获
    InvalidJarIndexException 类型的异常。
  • 开始调试你的程序。

  • 当 InvalidJarIndexException 被抛出时,Eclipse 将在您的异常断点处停止。即使没有 URLClassPath 的源,您仍然可以检查导致异常的堆栈上的变量,包括 URLClassPath 试图定位的类的名称。知道类的名称应该可以显着缩小您需要检查的 JAR 列表。

    也许您已经在本地向包中添加了一个新类,并且该包的内容由类路径上过时 JAR 中的索引文件描述?

    关于java - 如何在 Eclipse 中的 Tomcat 中使用导致 InvalidJarIndexException 的损坏的 JAR 索引来追踪 JAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5926333/

    相关文章:

    python - 包 __init__ 中 PyDev 中 Unresolved 导入

    tomcat - 在Spring Security中实现PKI认证

    java - 我怎样才能让 Tomcat 解释一个 jar 库?

    tomcat - mod_jk 帮助 ubuntu 服务器 9.04 上的 apache2 tomcat6 和 railo3

    java - java中的一个类可以控制另一个类中的对象吗?

    java - 如何在java中将Map<String,Object>编码为String值

    java - 使用 JpaRepository 缓存

    java - Spring @RequestBody 映射问题 - 如何查看未映射的值?

    java - 在 Eclipse RAP 中如何将当前 UI 状态推送/强制到客户端?

    java - 如何禁用 SWT 文本中的粘贴操作