如果 jar 文件具有 L 属性/重新解析点,为什么 Java 应用程序无法在 Windows 上运行
我真的希望以下几点钟声能给我们一个铃声,因为我们的想法已经用完了。有关如何进一步诊断的答案或建议将不胜感激。
我们有一个Java应用程序,它已经运行了18个月,没有任何问题。它现在正在迁移到一个将Windows Server 2019 Standard作为VM运行的新平台。在首次安装时,一切都会正常运行,但应用程序会定期无法启动,然后只能通过重新复制所有jar文件来修复。这是暂时的,因为最终它会再次失败。
经过大量监视,我们注意到有一个Windows进程定期在所有文件上设置“L”文件属性,并创建重新分析数据。这应该不是问题,但是一旦发生这种情况,JVM就无法启动应用程序。(任何Windows-whizzes都知道这是什么?
关键的一点是,应用程序是通过指定JPMS参数来启动的,例如:
java -p MyApp.jar;MyApp_mods -m mymodule/mypackage.StartGUI
这运行良好,在jar文件上设置了“L”属性,然后失败并显示消息:
Error occurred during initialization of boot layer
java.lang.module.FindException: Module format not recognized: MyApp.jar
将 MyApp.jar重命名为其他名称,然后将其复制回 MyApp.jar修复了此问题,因为它会创建一个没有 L 属性和重新分析数据的文件(直到进程重新应用它)
此行为不仅适用于此操作,还适用于使用模块系统的任何位置,例如:
java --list-modules any-jar-in-the-app.jar
有趣的是(!),如果我们尝试一个更简单的非模块化应用程序并运行如下:
java -jar MySimpleApp.jar
然后,即使设置了 L 属性,应用也能正常运行。
显然我们并不完全理解,但看起来好像通过模块系统运行意味着无法读取具有L属性/重新分析数据的文件(?
我们已经在各种版本中尝试了OpenJDK热点和OpenJ9 JVM,但结果相同。有什么想法吗?