26

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

4

2 回答 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 回答