【问题标题】:Java self-contained package wait for completionJava自包含包等待完成
【发布时间】:2019-02-11 21:20:09
【问题描述】:

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

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

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

【问题讨论】:

  • 您使用的是什么 jdk 和打包程序版本?你能发布你在构建过程中使用的打包命令吗?
  • @SebastianS javapackager -deploy -native -Bruntime="C:\Program Files\Java\jdk1.8.0_201\jre" -outdir packaged -outfile app -srcdir . -srcfiles target/app-0.0.1-SNAPSHOT.jar -appclass org.springframework.boot.loader.JarLauncher -name 'DocNormalizer' -title 'SelfContained'

标签: java javapackager


【解决方案1】:

我可以确认我使用 Oracle JDK 8、9 和 10 以及来自 OpenJDK 13 的快照中包含的 javapackager 打包的应用程序的这种行为。虽然生成的二进制文件在 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. {OUTDIR} 中创建一个调用runtime\bin\java.exe -jar ./app/yourapp.jar 的.bat 文件。
  4. 现在将 {OUTDIR} 添加到您的 .msi 或 innosetup 安装程序或 .zip 文件或您选择的任何分发方式 ;-)

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

【讨论】:

    猜你喜欢
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2011-06-09
    相关资源
    最近更新 更多