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

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


person David    schedule 01.12.2017    source источник


Ответы (2)


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

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

person Alan Bateman    schedule 01.12.2017

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

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

Учитывая два простых модуля, мы компилируем в Mac OS:

javac -d build/modules \
--module-source-path src \
`find src -name "*.java"`

jar --create --file=lib/[email protected] \
-C build/modules/net.codetojoy.db . 

jar --create --file=lib/[email protected] \
-C build/modules/net.codetojoy.service . 

Предполагая, что Linux 64 JDK распакован в локальный каталог (указанный как аргумент командной строки), мы вызываем 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

Затем, предполагая, что мы вытащили ubuntu образ для 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.

person Michael Easter    schedule 02.12.2017
comment
Использование JAVA_HOME в качестве имени переменной излишне сбивает с толку. Назовите его LINUX_JAVA_HOME или UNPACKED_LINUX_JAVA или ЧТО ТАКОЕ. - person Perdi Estaquel; 17.01.2019
comment
Какое функциональное назначение докера для среднестатистического ридера? Почему бы просто не извлечь целевой JDK в локальный каталог? Кроме того, исправьте неправильное использование зарезервированной переменной $JAVA_HOME в приведенном выше комментарии. - person tresf; 16.04.2019
comment
Использование докера здесь излишне усложняет. - person Guntram Blohm; 14.05.2019
comment
С другой стороны, использование здесь docker показывает, как протестировать недавно созданный двоичный файл на том же компьютере без использования виртуальной машины, перезагрузки или чего-либо еще. - person Dmitry Avtonomov; 29.01.2020