首页 > 解决方案 > jar 文件有时不会从网络共享启动

问题描述

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

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

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

我挖了很多以找到解决方案或此错误的详细描述,但我一无所获。

你有什么主意吗?

PS:我们使用这个代码片段来确定运行的是哪个版本的 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.

标签: javaspring-bootjavafxjar

解决方案


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

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

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

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

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

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

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

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

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

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

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


推荐阅读