代码之家  ›  专栏  ›  技术社区  ›  josh.trow

Java自包含包等待完成

  •  0
  • josh.trow  · 技术社区  · 7 年前

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

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

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   Sebastian S    7 年前

    我可以确认我打包使用的应用程序的这种行为 javapackager 包括在OracleJDK8、9和10以及OpenJDK13的快照中。虽然生成的二进制文件在MaOS和Linux下表现为“意料之中”,但Windows二进制文件似乎只是产生了一个新进程并立即退出。

    从Java 9开始 jpackager 调用 jlink 在内部,它有一个选择 --strip-native-commands 基本上从嵌入式JRE中删除二进制文件。对于Java8,您没有这个选项和可执行文件,比如 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 它将一直等到你的程序完成。

    推荐文章