仅用于一个应用程序的 JPackage?

JPackage for only one application?

我有一个 java 应用程序,它会在 运行 时产生另一个 JVM。但是我想使用 jpackage 打包我的应用程序,它工作得很好。但是在 运行 时间,当我的应用程序尝试使用

调用下一个 JVM 时
File javaHome = new File(System.getProperty("java.home"));
File java = new File(javaHome, "bin/java"); // may need a tweak on Windows
new ProcessBuilder().start(java.getAbsolutePath(), "-jar", ...);

我必须了解该应用程序是使用自定义构建的 JVM 启动的,只是没有 'java' 这样的命令。所以我得到的错误是这个 java.getAbsolutePath() 无法执行。

没有 java 可执行文件,我的应用程序如何在单独的进程中 运行 另一个 jar?我可以重复使用与我的应用程序捆绑在一起的 JVM,还是我仍然需要提供另一个?

默认情况下,jpackage 将在调用 jlink 以创建 运行 时间图像时传递以下标志:

--strip-native-commands --strip-debug --no-man-pages --no-header-files

正是这个 --strip-native-commands 标志从 运行time 图像中删除了 java 启动器。

您可以在调用 jpackage 时使用 --jlink-options 标志来覆盖默认命令,并删除 --strip-native-commands 标志:

--jlink-options "--strip-debug --no-man-pages --no-header-files"

这应该会导致 java 命令(以及其他命令)出现在创建的 运行time 图像中。


如果你想更多地控制 jpackage 使用的自定义 JVM/runtime 图像,你也可以手动 运行 jlink 创建一个 运行time 图像,并且然后使用 --runtime-image 标志将该图像传递给 jpackage