使用 Jlink 在一个平台上为另一个平台创建 Java 运行时映像

Create Java runtime image on one platform for another using Jlink

我在 Linux 机器上使用 jlink 创建了运行时映像。我在 include 文件夹下看到 linux 文件夹。这是否意味着我只能将此运行时映像用于 Linux 平台?如果是,是否有任何方法可以在一个平台上为另一个平台创建运行时图像(例如在 Linux 上为 Windows 反之亦然)

include 目录用于存放头文件,例如 jni.h,编译使用 JNI 和其他本机接口的 C/C++ 代码时需要这些头文件。与jlink.

无关

jlink 工具可以为另一个平台创建 运行 时间图像(交叉定位)。您需要下载两个 JDK 才能执行此操作。一个用于您 运行 jlink 的平台,另一个用于目标平台。 运行 jlink--module-path $TARGET/jmods 其中 $TARGET 是您为目标平台解压 JDK 的目录。

由于通常无法在信息方面为 Alan Bateman 的答案添加任何内容,我将提供一个工作示例。 This example 说明在 Mac OS 上使用 jlink,然后在 Docker 容器中 Ubuntu 上使用 运行 二进制文件。

重点如下

给定两个简单模块,我们在 Mac OS:

上编译
javac -d build/modules \
--module-source-path src \
`find src -name "*.java"`

jar --create --file=lib/net.codetojoy.db@1.0.jar \
-C build/modules/net.codetojoy.db . 

jar --create --file=lib/net.codetojoy.service@1.0.jar \
-C build/modules/net.codetojoy.service . 

假设 Linux 64 JDK 在本地目录中解压(指定为命令行参数),我们调用 jlink(在 Mac OS 在这个例子中)。 JAVA_HOME是解决的症结

#  is ./jdk9_linux_64/jdk-9.0.1
JAVA_HOME= 

rm -rf serviceapp 

jlink --module-path $JAVA_HOME/jmods:build/modules \
--add-modules net.codetojoy.service \
--output serviceapp

然后,假设我们已经为 Docker 提取了 ubuntu 图像,我们可以在 Docker 终端(即 Linux)中执行以下操作:

docker run --rm -v $(pwd):/data ubuntu /data/serviceapp/bin/java net.codetojoy.service.impl.UserServiceImpl

TRACER : hello from UserServiceImpl

重申 Java 9/jlink 的这个特性:Linux 没有安装 Java,Linux 二进制文件建立在Mac OS.