最可能的解释
您的路径是相对的,这意味着除非您从正确的位置运行批处理文件,否则它将无法工作。一般来说,有一个批处理文件,上面钉有一个不可见的骑手:“如果不从适当的目录运行,我会以神秘的方式破坏”是一个糟糕的批处理文件 - 让它变得更好。
更好的解决方案
或者,更好的是,摆脱它。您不需要批处理文件来分发 java 程序。
分发java程序的正确方法:
您的 jar 文件应该包含一个清单。此清单必须包含 2 个相关条目:
Class-Path: lda-services.jar bip-services-1.6.0.0-SNAPSHOT.jar decryptor-1.6.0.0-SNAPSHOT.jar slf4j-api-1.7.31.jar commons-io-2.6.jar
和
Main-Class: com.ilcore.util.SosaMaintenanceJFrame
您可以使用jar 的-m 开关,或者只包含清单(它只是jar 中的一个文件):它位于META_INF/MANIFEST.MF,它是一个文本文件,每一行都是一个条目,一个条目由 key: value 对组成。
当一个 jar 包含此内容时,只需双击该 jar 并运行 java -jar thejar.jar 即可完成所有工作:Java 将加载指定的 jar 作为类路径的一部分,并且至关重要的是,这些 jar 被解析为路径 相对于 jar 所在的目录,因此当您尝试从其他地方启动它们时它确实有效,即如果您这样做:
C:
CD \
java -jar "c:\Program Files\MyApp\myapp.jar"
它工作正常,而该批处理脚本会由于位置错误而失败。
构建系统也允许您定义清单,查看构建系统文档以了解如何执行此操作,这很容易,而且如果您在网上搜索大量教程,例如'manifest executable jar maven' 之类的。
一个带阴影的 jar 获取所有依赖项并将它们打包到您的主 jar 中,因此只有一个 jar。现在不需要 Class-Path 条目(您运行的 jar 显然已经在类路径中,并且没有其他要包含的内容)并且您的应用作为“只是”一个 jar 文件提供。
但这主要是一条红鲱鱼:不再有消费者 JRE,因此您已将用户体验从 D- 变为 D。如果您真的关心为您的用户提供良好的体验,那么就无法绕过某种安装过程,一旦有了它,拥有单独的 jar 就不再是问题。当涉及到签名的 jar 时,单独的 jar 不那么毛茸茸,更容易保持最新状态,并且周转速度明显更快(当你构建你的东西并想要运送你构建的东西时,阴影需要很长时间,所以最好剪掉它走出去)。您的 CI 系统越快告诉您失败的测试越好。
您不必升级到模块等。你可以做的是使用类似launch4j 的东西。目的是最终得到一个 zip 文件以及安装说明:在某处创建一个目录。把这个拉链解压进去。双击“myapp.exe”。完成。
该 zip 将包含一个完整的 JRE、您的所有 jar 文件 deps 和您的主应用程序,以及一个 launch4j 为您制作的 exe 文件,该文件使用打包到 jar 中的 JRE 启动您的应用程序。这意味着您确切知道正在使用哪个 JRE,它甚至可以在尚未安装的系统上工作(这些天,应该是所有这些 - '最终用户从 oracle 下载 JRE 的概念并且用户 + 预言机一起工作以保持该东西是最新的并且没有安全问题',已经死了)。
它是一个 EXE 的事实很好:现在如果用户例如alt+tabs 通过他们的应用程序,他们会得到你的应用程序,带有你的名字和你的图标,而不是带有丑陋咖啡杯标志的“javaw.exe”。