有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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


共 (2) 个答案

  1. # 1 楼答案

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

    jlink工具可以为另一个平台创建运行时映像(交叉目标)。你需要下载两个JDK来实现这一点。一个用于运行jlink的平台,另一个用于目标平台。使用 module-path $TARGET/jmods运行jlink,其中$TARGET是为目标平台解压JDK的目录

  2. # 2 楼答案

    一般来说,艾伦·贝特曼的答案在信息方面没有任何补充,我将提供一个有效的例子This example演示了在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上构建的