Создание образа среды выполнения 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.