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

使用Jlink在一个平台上为另一个平台创建Java运行时映像,java,java-9,java-platform-module-system,java-module,jlink,Java,Java 9,Java Platform Module System,Java Module,Jlink,我在Linux机器上使用jlink创建了运行时映像。我看到include文件夹下的linux文件夹。这是否意味着我只能在Linux平台上使用此运行时映像?如果是,是否有任何方法可以在一个平台上为另一个平台创建运行时映像(例如,在Linux for Windows上,反之亦然)include目录用于头文件,例如编译使用jni和其他本机接口的C/C++代码时需要的jni.h。这与jlink无关 jlink工具可以为另一个平台创建运行时映像(交叉目标)。您需要下载两个JDK来完成此操作。一个用于运行j

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

include目录用于头文件,例如编译使用jni和其他本机接口的C/C++代码时需要的
jni.h
。这与
jlink
无关


jlink
工具可以为另一个平台创建运行时映像(交叉目标)。您需要下载两个JDK来完成此操作。一个用于运行
jlink
的平台,另一个用于目标平台。使用
--模块路径$TARGET/jmods运行
jlink
,其中
$TARGET
是为目标平台解压JDK的目录。

通常无法在Alan Batman的答案中添加任何信息,因此我将提供一个工作示例。演示了在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解包在本地目录(指定为命令行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
然后,假设我们已经为Docker拉取了
ubuntu
图像,我们可以在Docker终端(即Linux)中执行以下操作:


要重新迭代Java 9/
jlink的此功能,请执行以下操作:Linux没有安装Java,并且Linux二进制文件是在Mac OS上构建的。

使用Java_HOME作为变量名会造成不必要的混乱。称之为LINUX\u JAVA\u HOME或Unpackated\u LINUX\u JAVA或其他任何东西。docker对普通读者来说有什么功能用途?为什么不将目标JDK提取到本地目录?此外,请纠正上述注释中保留的
$JAVA_HOME
变量的不当使用。在这里使用docker是不必要的过度复杂化。另一方面,在这里使用docker向您展示了如何在同一台机器上测试新创建的二进制文件,而无需使用VM、重新启动或其他任何操作。
docker run --rm -v $(pwd):/data ubuntu /data/serviceapp/bin/java net.codetojoy.service.impl.UserServiceImpl

TRACER : hello from UserServiceImpl