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

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


答案 1

该目录用于头文件,例如 ,在编译使用 JNI 和其他本机接口的 C/C++ 代码时需要这些文件。这与 .includejni.hjlink

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


答案 2

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

突出点如下。

给定两个简单的模块,我们在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 在本地目录(指定为命令行 arg)中解压缩,我们调用(在本例中为 Mac OS 上)。JAVA_HOME解决方案的关键:jlink

# $1 is ./jdk9_linux_64/jdk-9.0.1
JAVA_HOME=$1 

rm -rf serviceapp 

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

然后,假设我们已经为 Docker 拉取了映像,我们可以在 Docker 终端(即 Linux)中执行以下命令:ubuntu

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

TRACER : hello from UserServiceImpl

为了重申Java 9/的这一特性:Linux没有安装Java,Linux二进制文件是在Mac OS上构建的。jlink


推荐