热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

我真的希望以下内容能在我们没有想法时敲响警钟。关于如何进一步诊断的答案或建议将不胜感激。我们有一个Java应用程序,它已经运行了18个月没有问题。它现在正在迁移到运行

我真的希望以下内容能在我们没有想法时敲响警钟。关于如何进一步诊断的答案或建议将不胜感激。

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

经过大量监控,我们注意到有一个 Windows 进程会定期在所有文件上设置“L”文件属性并创建重新解析数据。这应该不是问题,但是一旦发生这种情况,JVM 将无法启动应用程序。(任何 Windows 高手都知道这是做什么的?)

一个关键点是应用程序是通过指定 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,但结果相同。有任何想法吗?

回答

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

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

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

我不确定这个过程到底是什么,但是重新解析标签 0x9000601A 的 Microsoft 文档是:

IO_REPARSE_TAG_CLOUD_6 - Used by the Cloud Files filter, for files managed by a sync engine such as OneDrive. Server-side interpretation only, not meaningful over the wire.

在 Java 中,类 BasicFileAttributes 由sun.nio.fs.WindowsFileAttributes. isRegularFile()如果FILE_ATTRIBUTE_REPARSE_POINT在文件属性中设置了该位,则对源的检查确认将返回 false 。

如果从类路径加载 .jar 文件,这些都不会导致问题,所以这是解决方法 - 不要使用 JPMS 运行。花了一个月的时间对应用程序进行模块化,这并不理想,但现在可以使用。

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

感谢您的回复 - 他们都提供了帮助。





回答

我想这是一个错误。

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

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

因此,解决方法是在文件中设置扩展属性以禁止此行为/错误。

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






推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
author-avatar
忧之灵_435
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有