我们有一个Spring Boot(v2)驱动的JavaFX应用程序(v8)。更多用户同时从网络共享在Windows上运行它(在java -jar
命令中使用批处理)。 Jar由Spring Boot Gradle插件创建,并在Oracle JRE 1.8上运行。
它运行正常几个月,但现在有时无法启动错误消息Error: invalid or corrupted jar file
。 (清单文件是正确的。)它通常发生在:
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");
我们开始在报告错误附近使用此代码。它仅在启动时运行。我看到流没有手动关闭或资源尝试块。它会导致这种行为吗?我认为不是因为GC将以不确定的延迟处理流,并且在两个应用程序启动之间估计更多小时。它与NoClassDefFoundError
无关。
它运行不可靠,因为这是一种非常安全且不可靠的运行应用程序的方法。可执行代码应该在执行它的机器上本地。
因此,如果由于某种原因它必须在网络驱动器上,那么它应该被复制到服务器,它将执行它然后在那里执行。
因为它几乎听起来像你在这里做某种构建过程所以使用像Jenkins这样的实际构建工具来做这个会更好。
在可从网络共享执行的问题的日志列表中:
o多个用户可以尝试同时执行它而导致冲突。
o在查看文件或在网络查看器中选择文件时,哪个文件共享协议可以锁定文件
o具有不同权限的不同用户将获得不同的行为。如果它试图查看驱动器或配置文件,或写入日志文件等,则该文件共享上的某些用户权限可能没有所需的访问权限。
o网络文件共享本质上是不可靠的,导致文件无法随机访问,或被报告为随机损坏。
o具有不同版本的网络协议的不同计算机上的不同用户将获得不同的行为。
o不同的共享协议以不同方式处理数据完整性检查,并将导致不同的结果
这可能会持续很长一段时间。你明白了。