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

Zim*_*ger 18 java jlink java-platform-module-system java-9 java-module

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

Ala*_*man 28

该include目录用于jni.h编译使用JNI和其他本机接口的C/C++代码时所需的头文件.这跟无关jlink.

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


Mic*_*ter 7

由于一般无法在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 . 
Run Code Online (Sandbox Code Playgroud)

假设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
Run Code Online (Sandbox Code Playgroud)

然后,假设我们已经ubuntu为Docker 提取了图像,我们可以在Docker终端(即Linux)中执行以下操作:

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

TRACER : hello from UserServiceImpl
Run Code Online (Sandbox Code Playgroud)

重新jlink尝试Java 9 /的这个特性:Linux没有安装Java,Linux二进制文件是在Mac OS上构建的.

  • 使用JAVA_HOME作为变量名称是不必要的混淆.将其命名为LINUX_JAVA_HOME或UNPACKED_LINUX_JAVA或WHATEVER. (4认同)
  • 另一方面,这里使用 docker 向您展示了如何在同一台计算机上测试新创建的二进制文件,而无需使用虚拟机、重新启动或其他任何操作。 (3认同)
  • 对于普通读者来说,docker 的功能用途是什么?为什么不直接将目标 JDK 解压到本地目录呢?另外,请修复上面注释中保留的“$JAVA_HOME”变量的不正确使用。 (2认同)