2

我正在开发一个应用程序,该应用程序在其他代码中包含许多 servlet。我使用的开发环境是 Eclipse(3.2.1,相当旧),在其中我使用 Eclipse Tomcat Wrapper 插件运行 Tomcat 服务器(5.5.23,也相当旧)来完成任务。所有这些都在 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(发生两次)

我确实发现了这个关于如何找到 Java 类的 JAR有用的堆栈溢出问题,并且我确实运行find /usr -name \*name-of-suspected-jar\*.jar了几次以追踪一些建议的违规 JARS。我还尝试在 Eclipse 中检查 Tomcat 服务器的运行时配置,但实际上无法将系统上的 JAR 文件与CLASSPATHTomcat 运行时设置(或CLASSPATH启动 Eclipse 时在环境中使用的)匹配。 这项工作可能需要我更加严格,但在此之前(这就是为什么我现在不在CLASSPATH这里发布有关 s 的所有血腥细节),我仔细阅读了到底是什么InvalidJarIndexException

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

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

所以,在写完一本小说之后,我的主要问题出现了:

  • 追踪.jar每个InvalidJarIndexException被抛出的精确文件的最佳方法是什么?
  • 检查随机选择.jar的文件是否有INDEX.LIST文件的最佳方法是什么,如果有,该文件是否有效(即非损坏)?这项任务有哪些工具?
  • 有没有一种有效的方法来自动推断文件的搜索顺序.jar?我可以尝试CLASSPATH手动操作,但老实说,这容易出错且乏味。
  • 有没有一种有效的方法来确定.jar搜索顺序中有哪些文件,这可能会使类加载器在搜索后指责无辜的、非损坏.jar的文件有不正确的INDEX.LIST文件?

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

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

4

2 回答 2

2

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

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

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

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

于 2011-08-03T20:42:28.650 回答
1

试试Tattletale,它是一个很好的 jar 报告工具。在这种情况下,我所做的是从罐子中一一消除 INDEX.LIST,直到我不再得到 InvalidJarIndexException

于 2011-09-07T11:02:46.783 回答