Создание собственного образа времени выполнения, предназначенного для конкретного модульного приложения
Допустим, я разрабатываю модульное приложение, которое состоит из 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