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

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


person malloc4k    schedule 20.09.2017    source источник


Ответы (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
person Naman    schedule 20.09.2017

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

Чтобы вместо этого включать только модули JDK, от которых зависит com.spacey.explorer, вам сначала нужно определить их, например с jdeps (см. также ответ нулевого указателя ). Узнав эти модули, вы можете определить их как корневые модули с помощью --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
person Nicolai Parlog    schedule 20.09.2017