【问题标题】:jar file sometimes doesn't start from network sharejar 文件有时不会从网络共享启动
【发布时间】:2019-03-20 11:33:06
【问题描述】:

我们有一个 Spring Boot (v2) 支持的 JavaFX 应用程序 (v8)。更多用户在 Windows 上同时从网络共享运行它(在java -jar 命令中使用批处理)。 Jar 由 Spring Boot Gradle 插件创建,在 Oracle JRE 1.8 上运行。

它可以正常运行几个月,但现在有时无法以错误消息Error: invalid or corrupted jar file 开始。 (清单文件是正确的。)它通常发生在:

  • 用户在应用程序运行时锁定了其 PC。在另一个用户登录并尝试启动同一个 jar 之后。这只发生在在锁定的用户会话中运行 jar 的那台 PC 上。它发生在多台机器上,而不仅仅是一台机器上。
  • 我们收到了一个错误报告:应用程序抛出了NoClassDefFoundError,但该类在 jar 中。我认为这些错误有关系。

我们会在一两周后定期发布,并且该错误出现在多个版本中。

我挖了很多东西想找到解决办法或者这个错误的详细描述,但是一无所获。

你有什么想法吗?

P.S.:我们使用这段代码 sn -p 来确定运行的是哪个版本的 jar:

        String manifestPath = classPath.substring(0, classPath.indexOf("!") + 1) +
                "/META-INF/MANIFEST.MF";
        Manifest manifest;
        manifest = new Manifest(new URL(manifestPath).openStream());
        return "v" + manifest.getMainAttributes().getValue("Manifest-Version");

我们开始使用此代码附近的错误报告。它仅在启动时运行。我看到流没有手动关闭或 try-with-resource 块。它会导致这种行为吗?我认为不是因为 GC 会以未确定的延迟处理流,并且估计两个应用程序启动之间的时间更长。而且它与NoClassDefFoundError没有关联。

【问题讨论】:

    标签: java spring-boot javafx jar


    【解决方案1】:

    它运行不可靠,因为这是运行应用程序的一种非常不安全和不可靠的方式。可执行代码应该在本地执行它的机器上。

    因此,如果由于某种原因它必须位于网络驱动器上,则应将其复制到将要执行它的服务器,然后在那里执行。

    因为这听起来像是您在这里执行某种构建过程,所以使用像 Jenkins 这样的实际构建工具来执行此操作会更好。

    在从网络共享执行时可能发生的问题的日志列表中:

    o 多个用户可能会同时尝试执行它,从而导致冲突。

    o 在查看文件或在网络查看器中选择文件时,哪种文件共享协议可能会锁定文件

    o 不同权限的用户会有不同的行为。如果它正在尝试查看驱动器或配置文件,或写入日志文件等,则该文件共享上的某些用户权限可能没有所需的访问权限。

    o 网络文件共享本质上是不可靠的,导致文件无法随机访问,或被随机报告为损坏。

    o 使用不同版本的网络协议的不同机器上的不同用户将获得不同的行为。

    o 不同的共享协议处理数据完整性检查的方式不同,会导致不同的结果。

    这可能会持续很长一段时间。你明白了。

    【讨论】:

    • 感谢@BrianC 的详细描述。我们正在等待错误再次发生。如果发生这种情况,我们将尝试从本地文件系统进行转换。我们认为可能是网络共享导致它,但用户希望从网络共享运行相同的文件,以防止在多台机器上更新 jar 和配置。如果可行,我们会将其分发到本地机器。
    猜你喜欢
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多