你的问题的答案并不简短。但我会尽量简短并指出所有相关信息。
简短的回答是:你可以做到这一点。
更长的答案是:您仍然必须从该目标环境中为每个目标环境构建一个运行时,但您只需执行一次。然后,您可以保存该运行时并重用它,以便在单个环境中使用最新的 Java jar/代码自动构建安装程序。例如,用于jlink
构建运行时映像并jpackage
为 Windows、Linux 和 macOS(在这些各自的系统上)构建应用程序映像,然后将这些应用程序映像复制到 macOS 并nsis
为每个平台构建安装程序(或您选择的安装程序构建器)从 macOS 内部。
当您更新代码并重新编译时,您只需将新 jar 复制到预构建的应用程序映像中即可。您还必须复制所有依赖项,但这对于任何安装程序都是必需的。在由它构建的运行时中有一个配置文件,jpackage
其中包含选项、类路径等,您可以更改它们而无需重新构建运行时。
- 创建一个可运行的程序,就像这样简单
package com.example;
public class Greeter {
public static void main(String[] args) {
System.out.println("Hi, I'm the greeter. Welcome.");
}
}
- 编译程序并放入 jar 中(
greeter.jar
在本例中调用它并放置在构建目录中,target
在本例中调用)
- 运行
jilnk
以构建运行时。以下命令使用jlink
JDK11 并将结果放在名为runtime
. 此示例包括模块路径上的所有模块,但您可以使用它jdeps
来获取您需要的模块。如果您不想在项目发展并依赖于更多 Java 运行时时重新构建此运行时,我建议包括所有模块。更不用说对 JRE 的传递依赖了。
> set JLINK=C:\Program Files\Java\jdk-11.0.6\bin\jlink.exe
> "%JLINK%" --no-header-files --no-man-pages --compress=2 --strip-debug --add-modules ALL-MODULE-PATH --output runtime
- 运行
jpackage
以构建适合在安装程序中打包的应用程序映像。这使用来自 JDK14 early access 的 jpackage(在撰写本文时唯一的 JDK 版本jpackage
)。命令行选项—win-console
仅适用于 Windows,并且仅在程序使用 stdin/stdout(控制台)执行某些操作时才需要。我们的示例写入控制台,所以我们需要这个。在运行您的应用程序时,此参数有时可能会打开一个控制台窗口,因此如果您有一个纯基于 Windows (gui) 的应用程序,请将其删除。
> set JPKG=C:\Program Files\Java\jdk-14-ea\bin\jpackage.exe
> "%JPKG%" --type app-image -i target —win-console -n Greeter --main-class com.example.Greeter --main-jar greeter.jar --runtime-image runtime
- 运行应用程序
.\Greeter\Greeter.exe
生成的应用程序映像(在app-image
目录中)可用于使用您最喜欢的安装构建器(我使用 NSIS)构建安装程序。您可以在任何平台上执行此操作。此外,当您更新程序时,您只需将新 jar 复制到应用程序映像中。无需重新构建应用映像或运行时。jar 的这个副本可以在任何平台上进行,并且不需要运行 Windows 来为您的应用程序的新版本构建新的安装程序。
如果您的应用程序具有 jar 依赖项(例如来自 Maven 中心),您需要将这些 jar 复制到Greeter/app
目录并app.classpath
在Greeter/app/Greeter.cfg
文件中更新。同样,所有这些都可以在任何平台上完成,无需启动目标平台(在我的例子中是 Windows)。
此外,jpackage
它是官方支持的工具,但仅在 EA JDK 14 中可用(我写的是 2020 年 2 月)。JDK 14 可以下载并jpackage
与其他版本的 JDK(如 JDK 11 LTS)一起使用。
请参阅https://blogs.oracle.com/jtc/a-brief-example-using-the-early-access-jpackage-utility
JEPjpackage
已被标记为“Closed/Delivered”,表明该工具已经成熟,正在等待 JDK 14 发布:https ://openjdk.java.net/jeps/343
GitHub 上有一个示例项目,其中有很多关于如何运行的有用命令行示例jlink
:jpackage
https: //github.com/jtconnors/SocketClientFX
虽然这个项目使用过时的命令选项。您可以运行jpackage --help
以获取新选项。
有用的链接:
JDK 14(提前访问至 2020 年 3 月 17 日):http: //jdk.java.net/14/
解释 jlink 的非模块化用法:https ://medium.com/azulsystems/using-jlink-to-build-java-runtimes-for-non-modular-applications-9568c5e70ef4
jlink 手册:https ://docs.oracle.com/javase/9/tools/jlink.htm#JSWOR-GUID-CECAC52B-CFEE-46CB-8166-F17A8E9280E9
jpackage - 运行-help
选项以获得良好的参考信息