Создание образа среды выполнения Java на одной платформе для другой с помощью Jlink

Я создал образ среды выполнения с помощью jlink на моей машине Linux. И я вижу под include папка. Означает ли это, что я могу использовать это время только для платформы Linux? Если да, существуют ли способы создания образов среды выполнения на одной платформе для другой (например, в Linux для Windows и наоборот)

2 ответов


The include каталог предназначен для заголовочных файлов, таких как jni.h, которые необходимы при компиляции кода C/C++, использующего JNI и другие интерфейсы. Это не имеет никакого отношения к jlink.

The jlink инструмент может создать образ времени выполнения для другой платформы (перекрестный таргетинг). Для этого вам нужно скачать два JDKs. Один для платформы, где вы бежите jlink, другой для целевой платформы. Запустить jlink С --module-path $TARGET/jmods здесь $TARGET - каталог, куда вы распаковали JDK для целевой платформы.


будучи вообще не в состоянии добавить что-либо к ответам Алана Бейтмана с точки зрения информации, я предложу рабочий пример. иллюстрирует использование jlink на Mac OS, а затем запуск двоичного файла на Ubuntu в контейнере Docker.

основные моменты заключаются в следующем.

учитывая два простых модуля, мы компилируем на 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 распакован в локальном каталоге (заданном как командная строка арг), мы называем jlink (на Mac OS в этом примере). JAVA_HOME суть решения:

#  is ./jdk9_linux_64/jdk-9.0.1
JAVA_HOME= 

rm -rf serviceapp 

jlink --module-path $JAVA_HOME/jmods:build/modules \
--add-modules net.codetojoy.service \
--output serviceapp

тогда, предполагая, что мы вытащили ubuntu image for Docker, мы можем выполнить следующее в терминале 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.