我在我的 Linux 机器上使用 jlink 创建了运行时映像。我看到linux
文件夹下的include
文件夹。这是否意味着我只能将这个运行时映像用于 Linux 平台?如果是,是否有任何方法可以在一个平台上为另一个平台创建运行时映像(例如,在 Linux 上为 Windows 上,反之亦然)
问问题
5413 次
2 回答
42
该include
目录用于存放头文件,例如jni.h
编译使用 JNI 和其他本机接口的 C/C++ 代码时需要的头文件。这与 无关jlink
。
该jlink
工具可以为另一个平台创建运行时映像(交叉定位)。您需要下载两个 JDK 来执行此操作。一个用于您运行的平台jlink
,另一个用于目标平台。运行wherejlink
是您为目标平台解压缩 JDK 的目录。--module-path $TARGET/jmods
$TARGET
于 2017-12-01T13:16:04.927 回答
11
通常无法在信息方面对 Alan Bateman 的答案添加任何内容,我将提供一个工作示例。此示例说明jlink
在 Mac OS 上使用,然后在 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 在本地目录(指定为命令行 arg)中解压,我们调用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
然后,假设我们已经ubuntu
为 Docker 拉取了镜像,我们可以在 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 上构建的。
于 2017-12-02T19:31:21.280 回答