Tomcat 7.0.22 Windows 服务因 JRE 更新而中断

Tomcat 7.0.22 Windows 服务因 JRE 更新而中断

如果在未先手动停止 Tomcat 服务的情况下运行 JRE 更新,则 Tomcat 在下次停止后将不再启动。这种情况通常发生在按照 JRE 安装程序的要求重新启动后。

重现错误

  • 将最新的 Tomcat 7 安装为 Windows 服务,并安装 Java 6 u29。Tomcat 应该可以正常运行。
  • 更新至 Java 6u31无需先停止 Tomcat 服务。Java 需要重新启动服务器,重新启动后 Tomcat 服务将不再启动。

重启后记录

Tomcat 7 标准输出

2012-04-03 12:25:02 Commons Daemon procrun stdout initialized 
2012-04-03 12:42:25 Commons Daemon procrun stdout initialized 
Error occurred during initialization of VM java/lang/NoClassDefFoundError: java/lang/Object 

Tomcat7 stderr 的最后一部分 (Java 更新并重启后的唯一一行)

2012-04-03 12:42:25 Commons Daemon procrun stderr initialized

答案1

我们在一个作为 Windows 服务运行的长期运行(但不是 Tomcat)Java 应用程序中观察到了这一点。我们使用 Apache Commons Daemon 中的“procrun”机制将其创建为 Windows 服务,这与 Tomcat Windows 服务的工作方式相同。

从其他报告的提示来看,Java 更新过程似乎在升级到新版本的过程中移动/重命名文件。安装完成后可能还剩下一两个重命名操作,这些重命名操作应该在重新启动后进行。但如果在更新的同时有一个长时间运行的 Java 应用在运行,该应用将锁定各种 Java 库和 exe(如主 jre.exe),Java 更新将失败。

这种情况的一个症状是打开命令窗口并输入“java -version”。如果您收到 java/lang/Object 的 noclassdeffound 错误,那么很有可能是因为 JDK 升级与长时间运行的 Java 应用程序相结合导致 JDK/JRE 损坏。

我们找到了两种解决方法:(1) 重新安装应用程序;(2) 重新安装 Java。(1) 通常对我们有用,因为我们有一个应用程序安装程序,如果需要,它还会安装一个干净的 Java 版本。但有时甚至会失败,并显示消息“无法执行 jar 文件‘reach-stream-installer-izpack.jar’。”(IzPack 是我们使用的自动安装程序工具)。在这种情况下,我们会回到 (2)。

这两种解决方法都不太好。遗憾的是,Java 提供的 JDK 自动更新功能破坏了我们的应用程序。

从您最初发布帖子以来,有什么进展吗?

相关内容