使用Jlink在一个平台上为另一个平台创建Java运行时映像
我在Linux机器上使用jlink创建了运行时映像。我看到使用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
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