Анализ зависимостей Java приложения и своя сборка JRE

В 2017 году вышла новая версия Java 9. В числе многих плюшек в ней был реализован проект Jigsaw, который добавлял модульность в Java машину.

И буквально на выходных я задался вопросом, а можно ли как-то понять, какие модули используются выбранным Java приложением. Как оказалось это сделать достаточно просто, в инструментах есть утилита jdeps.

С помощью этой утилиты можно получить список зависимостей для отдельного java класса или целиком jar-файла.

Пример использования:

$ jdeps  client-0.1.jar
client-0.1.jar -> java.base
client-0.1.jar -> not found
   ru.maksimvoloshin.client                                -> java.io                                            java.base
   ru.maksimvoloshin.client                                -> java.lang                                          java.base
   ru.maksimvoloshin.client                                -> java.lang.invoke                                   java.base
   ru.maksimvoloshin.client                                -> java.net                                           java.base
   ru.maksimvoloshin.client                                -> java.nio                                           java.base
   ru.maksimvoloshin.client                                -> java.nio.channels                                  java.base
   ru.maksimvoloshin.client                                -> java.nio.charset                                   java.base
   ru.maksimvoloshin.client                                -> java.nio.file                                      java.base
   ru.maksimvoloshin.client                                -> java.time                                          java.base
   ru.maksimvoloshin.client                                -> java.util                                          java.base
   ru.maksimvoloshin.client                                -> java.util.function                                 java.base
   ru.maksimvoloshin.client                                -> java.util.stream                                   java.base
   ru.maksimvoloshin.client                                -> org.slf4j                                          not found
   ru.maksimvoloshin.client                                -> ru.maksimvoloshin.lib                              not found

Для примера я написал небольшой сетевой клиент и собрал его в jar файл. Анализ показывает, как части JRE у нас используются, а так же, каких зависимостей у нас в JRE нет. Эти зависимости подключены как библиотеки в pom файле maven’а. Это библиотека логирования Slf4j и моя собственная библиотека.

Следующая утилита, которая оказалась мне очень полезна это упаковка своей собственной версии JRE. Это утилита jlink.

Пример использования:

jlink --module-path "$JAVA_HOME/jmods" --add-modules java.base --output custom-runtime

И в папке custom-runtime у нас теперь будет лежать своя маленькая JRE, которая содержит только модуль java.base

Анализ зависимостей Java приложения и своя сборка JRE

А файл release будет содержать информацию о версии JRE и модулях, которые в ней есть

$ cat custom-runtime/release
JAVA_VERSION="21.0.3"
MODULES="java.base"

Также, поскольку это JRE, каталог bin будет избавлен от всех утилит разработчика. Итоговая сборка JRE у меня заняла 46.5Мб.

Вам может также понравиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *