0

我有一个应用程序,我需要它是一个独立的应用程序,可安装在可能没有 Java 的计算机上。我正在使用javapackager命令创建一个可以发送给用户的 EXE,其中包含所需的所有部分。简单来说,应用程序读取第一个参数引用的文件,对其进行转换,然后在源文件旁边写回结果。当直接将其作为 JAR 运行时,以及通过内置的 EXE 运行时,所有这些都有效。

问题是在触发可执行文件时,它会立即将执行返回到命令提示符,而不是等待进程完成。我不想轮询输出目录以检查文件是否存在,然后在何时停止查找时给出一些任意超时 - 我希望应用程序知道一旦控制台命令完成,处理就完成了。那时我可以根据我是否找到结果文件来做逻辑,如果没有找到或者其他任何逻辑是正确的,就会发出警报。

有没有办法告诉javapackager命令在返回控制权之前设置等待,直到 Java 死亡(好或坏)?除此之外,是否有一个代码片段/概念可以使应用程序推迟将控制权释放回终端,直到 JVM 死亡?

4

1 回答 1

0

我可以确认我使用javapackagerOracle JDK 8、9 和 10 以及 OpenJDK 13 的快照打包的应用程序的这种行为。虽然生成的二进制文件在 macOS 和 Linux 下表现“如预期”,但 Windows 二进制文件似乎只是产生一个新进程并立即退出。

从 Java 9 开始在内部jpackager调用jlink,它有一个--strip-native-commands从嵌入式 JRE 中删除二进制文件的选项。在 Java 8 中,您没有此选项,并且总是删除诸如此类的java.exe可执行文件。但是我的测试表明 JRE 是完整的,您应该能够简单地java.exe手动包含(最好彻底测试!)。

因此,我提出以下解决方法:

  1. 使用创建应用程序目录javapackager -deploy -native image
  2. java.exe从您的系统范围的 JRE 安装复制到{OUTDIR}\runtime\bin(检查您的许可证是否涵盖重新分发 java.exe!)
  3. 在里面创建一个 .bat 文件{OUTDIR},调用runtime\bin\java.exe -jar ./app/yourapp.jar.
  4. 现在添加{OUTDIR}到您的 .msi 或 innosetup 安装程序或 .zip 文件或您选择的任何分发方式;-)

然后,您可以调用 bat 文件而不是 exe。因为它只是一个包装器,java -jar它会等到你的程序完成。

于 2019-02-12T16:58:42.793 回答