我有一个应用程序,需要成为一个独立的应用程序,可以在没有Java的计算机上安装。我正在使用javapackager
命令创建一个可以发送给用户的EXE,其中包含所需的所有部分。从简单的意义上讲,该应用程序读取第一个参数引用的文件,对其进行转换,然后在源文件旁边写回结果。当直接以JAR形式运行它时,以及通过内置的EXE运行它时,所有这些方法均有效。
问题在于,触发可执行文件时,它会立即将执行返回给命令提示符,而不是等待进程完成。我不想轮询输出目录来检查文件是否存在,然后给出何时停止查找的任意超时-我希望应用程序知道控制台命令完成后,处理就完成了。那时,我可以根据是否找到结果文件进行逻辑处理,并在未找到结果文件或其他任何逻辑正确的情况下发出警报。
是否有一种方法可以告诉javapackager
命令设置一个等待,直到Java死掉(好坏)再返回控制权?除非有这样的代码片段/概念,否则该应用程序会阻止应用释放将控制权释放回终端,直到JVM死掉为止。
答案 0 :(得分:0)
对于使用Oracle JDK 8、9和10随附的javapackager
打包的应用程序以及OpenJDK 13的快照,我可以确认此行为。而生成的二进制文件在macOS下的行为“符合预期”和Linux,Windows二进制文件似乎只是产生了一个新进程并立即退出。
从Java 9开始,jpackager
在内部调用jlink
,它具有选项--strip-native-commands
,该选项基本上从嵌入式JRE中删除二进制文件。使用Java 8时,您没有此选项,并且总是会删除java.exe
之类的可执行文件。但是我的测试表明,JRE在其他方面已经完成,并且您应该可以简单地手动添加java.exe
(更好地进行测试!)。
因此,我提出以下解决方法:
javapackager -deploy -native image
java.exe
从系统范围的JRE安装复制到{OUTDIR}\runtime\bin
(检查您的许可证是否涵盖重新分发java.exe!){OUTDIR}
内创建一个调用runtime\bin\java.exe -jar ./app/yourapp.jar
的.bat文件。{OUTDIR}
添加到您的.msi或innosetup安装程序或.zip文件或您选择的任何分发方式;-)然后可以调用bat文件而不是exe。由于它只是java -jar
的包装器,因此它将等到您的程序完成。