Create Java runtime image on one platform for another using Jlink

后端 未结 2 1543
遇见更好的自我
遇见更好的自我 2020-11-29 04:48

I created runtime image using jlink on my Linux machine. And I see linux folder under the include folder. Does it mean that I can use this runtime

相关标签:
2条回答
  • 2020-11-29 05:10

    The include directory is for header files, such as jni.h, that are needed when compiling C/C++ code that uses JNI and other native interfaces. It's nothing to do with jlink.

    The jlink tool can create a run-time image for another platform (cross targeting). You need to download two JDKs to do this. One for the platform where you run jlink, the other for the target platform. Run jlink with --module-path $TARGET/jmods where $TARGET is the directory where you've unzipped the JDK for the target platform.

    0 讨论(0)
  • 2020-11-29 05:31

    Being generally unable to add anything to Alan Bateman's answers in terms of information, I'll offer a working example. This example illustrates using jlink on Mac OS and then running the binary on Ubuntu in a Docker container.

    The salient points are as follows.

    Given two simple modules, we compile on 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 . 
    

    Assuming that the Linux 64 JDK is unpacked in a local directory (specified as command-line arg), we call jlink (on Mac OS in this example). JAVA_HOME is the crux of the solution:

    # $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
    

    Then, assuming we've pulled the ubuntu image for Docker, we can execute the following in a Docker terminal (i.e. Linux):

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

    To re-iterate this feature of Java 9/jlink: Linux does not have Java installed and the Linux binary was built on Mac OS.

    0 讨论(0)
提交回复
热议问题