Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果jar文件具有L属性/重分析点,为什么Java应用程序无法在Windows上运行_Java_Windows_Java Platform Module System_Reparsepoint - Fatal编程技术网

如果jar文件具有L属性/重分析点,为什么Java应用程序无法在Windows上运行

如果jar文件具有L属性/重分析点,为什么Java应用程序无法在Windows上运行,java,windows,java-platform-module-system,reparsepoint,Java,Windows,Java Platform Module System,Reparsepoint,我真的希望下面这段话能给一些人敲响警钟,因为我们的想法已经不多了。关于如何进一步诊断的答案或建议将不胜感激 我们有一个Java应用程序,已经运行了18个月,没有任何问题。它现在正转向一个新的平台,作为VM运行Windows Server 2019标准。 在第一次安装时,一切都正常运行,但应用程序会周期性地启动失败,然后只能通过重新复制所有jar文件来修复。这是暂时的,因为最终会再次失败 在进行了大量监视之后,我们注意到有一个Windows进程定期在所有文件上设置“L”文件属性,并创建重分析数据。

我真的希望下面这段话能给一些人敲响警钟,因为我们的想法已经不多了。关于如何进一步诊断的答案或建议将不胜感激

我们有一个Java应用程序,已经运行了18个月,没有任何问题。它现在正转向一个新的平台,作为VM运行Windows Server 2019标准。 在第一次安装时,一切都正常运行,但应用程序会周期性地启动失败,然后只能通过重新复制所有jar文件来修复。这是暂时的,因为最终会再次失败

在进行了大量监视之后,我们注意到有一个Windows进程定期在所有文件上设置“L”文件属性,并创建重分析数据。这不应该是一个问题,但一旦发生这种情况,JVM就无法启动应用程序。(有谁知道这是怎么回事?)

一个关键点是,通过指定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,但结果相同。有什么想法吗?

我想这是个bug

重新分析点属性由NTFS文件系统用于实现符号链接、实现装入点和实现其他文件系统技术,如将较少使用的文件自动移动到长期存储区域(压缩文件/文件系统)/或设备(例如磁带)

重分析点和扩展属性是互斥的。当文件包含扩展属性时,NTFS文件系统无法创建重分析点,并且无法在包含重分析点的文件上创建扩展属性

因此,一种解决方法是在文件中设置一个扩展属性来禁止这种行为/错误


PS我猜您的Windows服务器运行某种“自动压缩/移动较少使用的文件”服务,如果可能,请停用此服务。

这只是部分答案,但值得展示,以防有人遇到同样的问题。当有更多信息时,我会尝试更新,但可能需要一段时间。(更新19/4/21-报告错误。请参阅)

正如Naman指出的,问题在于JPMS代码在.jar文件中查找模块信息。部分代码获取文件属性并检查
attr.isRegularFile()
。如果为false,则抛出
java.lang.module.FindException:module format not recognized

每当Windows文件管理进程运行时,它都会创建一个重分析点,并在文件上设置L属性。在此之后,
attr.isRegularFile()
返回false

我不确定具体的过程是什么,但重新分析标签0x9000601A的Microsoft文档是:
IO_repasse_TAG_CLOUD_6-用于云文件过滤器,用于由同步引擎(如OneDrive)管理的文件。仅服务器端解释,没有意义。

在Java中,类BasicFileAttributes是通过
sun.nio.fs.WindowsFileAttributes
为Windows实现的。如果在文件属性中设置了
FILE\u ATTRIBUTE\u repasse\u POINT
位,则检查源代码确认
isRegularFile()
将返回false

如果从类路径加载.jar文件,这都不会导致问题,因此这是解决方法——不要使用JPMS运行。花了一个月的时间来开发这个应用程序,这并不理想,但目前它还可以工作

我认为这一定是JPMS中的一个bug,因为可以通过类路径而不是模块路径加载.jar文件是毫无意义的。我将收集更多信息并报告,尽管复制可能会很困难


感谢您的回复-他们都很有帮助。

fsutil repassepoint query MyApp.jar的输出是什么?重分析点是类似于符号链接的文件系统对象,但通常支持文件系统扩展。很明显,某些东西正在改变属性,调试的第一步是找出创建了哪种RP…在扫描模块路径和类路径以找出模块的文件方面的差异可能是原因?看起来是抛出行。fsutil输出为:
重新分析标记值:0x9000601a标记值:Microsoft标记值:目录…后跟0x172字节的二进制数据,其中不包含任何有用的文本。
我假设这是某种文件系统管理。我的客户(一家慈善机构)使用了一家托管公司,我问过这个过程是什么,是否可以选择性地禁用。Naman-感谢链接。如果(attrs.isRegularFile()){,问题似乎在第324行
处。添加重新分析数据后,isRegularFile()返回false,因此不存在匹配项并引发异常。出于兴趣,isSymbolicLink()还返回false和isOther()返回true。在Windows下,Files.readAttributes返回一个类的实例,该类包含一个方法isReparsePoint(),该方法可以通过反射运行并返回true。我将进行更多实验并报告该行为。“非常肯定”在最后一点上,现在的硬盘非常庞大,但很明显,那个版本的Windows并没有得到应有的支持