Создание собственного образа времени выполнения, предназначенного для конкретного модульного приложения

Допустим, я разрабатываю модульное приложение, которое состоит из 2 модулей: com.spacey.explorer это зависит от com.spacey.rocket модуль. У меня есть свои модульные файлы JAR в некоторых bin каталог.

И я хочу подготовить легкий JRE для запуска. Очевидно, я использую инструмент jlink:

$ jlink --module-path /opt/jdk-9/jmods:../bin --add-modules com.spacey.explorer --output ~/custom-jre3

Теперь, когда я перечисляю модули в моей JRE, я получаю следующее:

$ java --list-modules 
com.spacey.explorer
com.spacey.rocket
java.base@9

То есть модули моего приложения объединены в JRE. Но если я хотел создать JRE, в котором есть только исходные модули JDK, достаточные для запуска моего приложения и разделения модулей приложения, я должен знать, каковы мои зависимости JDK (в примере это просто java.base) и указать их явно как:

$ jlink --module-path /opt/jdk-9/jmods --add-modules java.base --output ~/custom-jre3

Есть ли способ заставить jlink сделать это для меня? Или какой-нибудь инструмент, который бы выяснил для меня эти зависимости от JDK?

2 ответа

Решение

Вы можете использовать инструмент jdeps. Вариант, который может помочь:

jdeps --list-deps <path>

Перечисляет зависимости и использование внутренних API JDK.

где <path> может быть путем к файлу.class, каталогу, файлу JAR.

Примечание: использовать jdeps -help перечислить все опции и их синтаксис. Ты можешь использовать


Например, я попробовал файл jar в папке.m2 моей машины, который будет рассматриваться как безымянный модуль, например:

jdeps --list-deps /.m2/repository/org/apache/commons/commons-lang3/3.6/commons-lang3-3.6.jar

Выход::

java.base
java.desktop
unnamed module: /.m2/repository/org/apache/commons/commons-lang3/3.6/commons-lang3-3.6.jar

Вы также можете использовать

jdeps --jdk-internals --class-path <path> <path>

Находит зависимости на уровне класса от внутренних API JDK. По умолчанию он анализирует все классы в --class-path и входных файлах, если не указана опция -include.


Обновление ноября 1,2017

В будущем будет внесено изменение, чтобы использовать то же самое с jlink как:

jlink --module-path jmods --add-modules $(jdeps --print-module-deps myapp.jar) --output image

Чтобы создать образ времени выполнения с jlink вам нужно указать корневые модули с --add-modules - начиная с этих модулей, jlink создаст график модулей и включит все разрешенные модули в новый образ. Вы использовали --add-modules com.spacey.explorer, так jlink включает в себя com.spacey.explorer и все его зависимости.

Вместо этого, чтобы включить только модули JDK, от которых зависит com.spacey.explorer, сначала нужно определить их, например, с помощью jdeps (см. Также ответ nullpointer). Когда вы знаете эти модули, вы можете определить их как корневые --add-modules,

В вашем примере:

$ jlink 
    --module-path /opt/jdk-9/jmods
    --add-modules java.base
    --output ~/custom-jre-for-explorer

Если бы было больше модулей, чем просто java.base, скажем java.sql, команда выглядела бы следующим образом:

$ jlink 
    --module-path /opt/jdk-9/jmods
    --add-modules java.base,java.sql
    --output ~/custom-jre-for-explorer
Другие вопросы по тегам