我正在开发一个应用程序,该应用程序在其他代码中包含许多 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 文件与CLASSPATH
Tomcat 运行时设置(或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 ......我保证)