我在Linux机器上使用jlink创建了运行时映像。我看到include
文件夹下有linux
文件夹。这是否意味着我只能在Linux平台上使用此运行时映像?如果是,是否有办法在一个平台上为另一个平台创建运行时映像(例如,在Linux上为Windows创建,反之亦然)?
我在Linux机器上使用jlink创建了运行时映像。我看到include
文件夹下有linux
文件夹。这是否意味着我只能在Linux平台上使用此运行时映像?如果是,是否有办法在一个平台上为另一个平台创建运行时映像(例如,在Linux上为Windows创建,反之亦然)?
include
目录是用于存放头文件的,例如 jni.h
这样的文件。编译使用 JNI 和其他本地接口的 C/C++ 代码时需要这些头文件。它与 jlink
没有任何关系。
jlink
工具可以为另一个平台创建一个运行时映像(进行交叉目标)。您需要下载两个 JDK 来执行此操作。一个是在运行 jlink
的平台上使用的 JDK,另一个是针对目标平台的 JDK。使用 --module-path $TARGET/jmods
运行 jlink
,其中 $TARGET
是您解压用于目标平台的 JDK 的目录。
鉴于我无法在信息方面对Alan Bateman的回答进行任何补充,我将提供一个工作示例。此示例说明了如何在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
是解决方案的关键:
# $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拉取了 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上构建的。
$JAVA_HOME
变量的不当使用。 - tresf