jar文件有时不是从网络共享开始的

时间:2019-03-20 11:33:07

标签: java spring-boot javafx jar

我们有一个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 .:我们使用以下代码段确定运行的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没有关联。

1 个答案:

答案 0 :(得分:0)

它运行不可靠,因为这是一种运行应用程序的非常不安全且不可靠的方式。可执行代码应位于执行该代码的计算机上。

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

由于听起来好像您在这里正在执行某种构建过程,所以最好使用像Jenkins这样的实际构建工具来执行此操作。

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

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

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

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

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

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

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

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