Анализ зависимостей 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

А файл release будет содержать информацию о версии JRE и модулях, которые в ней есть
$ cat custom-runtime/release
JAVA_VERSION="21.0.3"
MODULES="java.base"
Также, поскольку это JRE, каталог bin будет избавлен от всех утилит разработчика. Итоговая сборка JRE у меня заняла 46.5Мб.

Последние комменатрии