Я создал образ времени выполнения, используя jlink на моем компьютере с Linux. И я вижу папку linux
в папке include
. Означает ли это, что я могу использовать этот образ среды выполнения только для платформы Linux? Если да, есть ли способы создать образы среды выполнения на одной платформе для другой (например, в Linux для Windows и наоборот)
Создайте образ среды выполнения Java на одной платформе для другой с помощью Jlink
Ответы (2)
Каталог include
предназначен для файлов заголовков, таких как jni.h
, которые необходимы при компиляции кода C / C ++, который использует JNI и другие собственные интерфейсы. Это не имеет отношения к jlink
.
Инструмент jlink
может создавать образ во время выполнения для другой платформы (перекрестный таргетинг). Для этого вам необходимо загрузить два JDK. Один для платформы, на которой вы запускаете 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/[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.
$JAVA_HOME
в приведенном выше комментарии.
- person tresf; 16.04.2019