我使用Linux计算机上的JLINK创建了运行时映像。我在include
文件夹下看到linux
文件夹。这是否意味着我只能在Linux平台上使用此运行时映像?如果是,是否有任何方法可以在一个平台上创建运行时图像的另一个平台(例如,在Windows的Linux上,反之亦然)
include
目录用于标头文件,例如 jni.h
,在编译使用JNI和其他本机接口的C/C 代码时需要。与jlink
无关。
jlink
工具可以为另一个平台创建运行时图像(交叉定位)。您需要下载两个JDK来做到这一点。一个用于您运行jlink
的平台,另一个用于目标平台。使用--module-path $TARGET/jmods
运行jlink
,其中$TARGET
是目标平台的JDK的目录。
通常无法在艾伦·贝特曼(Alan Bateman)的答案中添加任何东西,我将提供一个工作示例。此示例说明了在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):
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上构建的。