使用 Jlink 在一个平台上为另一个平台创建 Java 运行时映像
2022-09-01 14:00:13
我在我的Linux机器上使用jlink创建了运行时映像。我在文件夹下看到文件夹。这是否意味着我只能将此运行时映像用于 Linux 平台?如果是,是否有任何方法可以在一个平台上为另一个平台创建运行时映像(例如,在Windows的Linux上,反之亦然)linux
include
我在我的Linux机器上使用jlink创建了运行时映像。我在文件夹下看到文件夹。这是否意味着我只能将此运行时映像用于 Linux 平台?如果是,是否有任何方法可以在一个平台上为另一个平台创建运行时映像(例如,在Windows的Linux上,反之亦然)linux
include
该目录用于头文件,例如 ,在编译使用 JNI 和其他本机接口的 C/C++ 代码时需要这些文件。这与 .include
jni.h
jlink
该工具可以为另一个平台创建运行时映像(交叉定位)。您需要下载两个 JDK 才能执行此操作。一个用于您运行的平台,另一个用于目标平台。使用已解压缩目标平台的 JDK 的目录位置运行。jlink
jlink
jlink
--module-path $TARGET/jmods
$TARGET
由于通常无法在信息方面为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