Все о fat JAR в Java: что это и как использовать
Быстрый ответ
Толстый JAR-файл — это архив большого размера, совмещающий в одном файле все компоненты вашего приложения, включая его зависимости. Этот подход гарантирует безошибочное функционирование приложения. Создать его можно с помощью Maven и плагина maven-assembly-plugin
или с использованием Gradle и shadowJar
.
Вот так выглядит пример с Maven:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
А это пример с Gradle:
plugins {
id 'com.github.johnrengelman.shadow' version '5.2.0'
}
Определите входную точку — Main-Class
в манифесте, соберите проект и запустите его командой java -jar ваш-толстый-jar.jar
. Процесс действительно прост!
Различные типы JAR-файлов
Знание типов JAR-файлов поможет вам выбрать подходящий вариант:
- "Худой" JAR содержит только ваши классы без внешних библиотек.
- "Тонкий" JAR включает ваши классы и необходимые прямые зависимости.
- "Пустой" JAR требует наличия дополнительных JAR-файлов для выполнения своих функций.
Каждый из этих типов имеет своё применение в различных сценариях разработки и развертывания.
Преимущества использования "толстых" JAR-ов
Использование толстых JAR-файлов обезопасит вас от конфликтов зависимостей и ошибок, связанных с неправильной настройкой classpath. Этот подход привносит следующие преимущества:
- Исключение конфликтов разных версий зависимостей.
- Уверенность в стабильной работе в различных окружениях.
- Простота использования без необходимости дополнительной настройки.
Создание "толстого" JAR
Пользователи Maven могут использовать maven-assembly-plugin
и maven-shade-plugin
. Первый позволяет настроить процесс сборки через дескрипторы, второй — перепаковывает архив, включая все зависимости.
Для тех, кто предпочитает Gradle, подойдет shadowJar
, который объединяет все необходимые артефакты и зависимости, умело решая вопросы конфликтов. Также функция zipTree()
в Gradle позволяет создавать пользовательские задачи для формирования "толстых" JAR-файлов.
Визуализация
Можно представить толстый JAR как тщательно упакованный чемодан:
Обычный JAR: 🧳👕 (Сбор в последний момент)
Толстый JAR: 🧳👕👖👟🧦🔌📚 (Тщательно подготовлен)
Толстый JAR включает все необходимое:
Толстый JAR: 📦💾
- Ваш код: 👨💻💼
- Библиотеки: 📚🔗
- Ресурсы/Настройки: 📃🛠️
Для Java-приложений это универсальное решение:
🚀 Запуск одним кликом мыши 🖱️ с `java -jar command`
Проблемы и их решения при работе с "толстыми" JAR-файлами
У толстых JAR-файлов могут возникнуть следующие проблемы:
- Увеличенный размер файла может усложнить его распространение и увеличить время загрузки.
- Возможные конфликты зависимостей из-за дублирования классов.
Чтобы решить эти проблемы:
- Можно минимизировать JAR при помощи таких инструментов, как ProGuard, который удаляет неиспользуемые классы.
- Чтобы избежать конфликтов зависимостей, нужно "затенять" классы, изменяя их пакеты.
"Толстый" JAR: лучшие практики
Следуйте лучшим практикам:
- Обновляйте зависимости, чтобы защитить свое приложение от уязвимостей.
- Понимайте взаимоотношения между загрузчиками классов и структурой JAR-архивов.
- Используйте системы непрерывной интеграции для автоматизации сборки.
Альтернативное название: Uber JAR
Термин Uber JAR — это альтернативное название толстого JAR, подчеркивающее его полноту и автономность. За дополнительной информацией можно обратиться на сайт imagej.net.
Полезные материалы
- Построение проектов на Java и JVM – Официальная документация Gradle по созданию Java-приложений.
- Apache Maven Shade Plugin – Введение – Полное руководство по созданию "толстых" JAR-файлов с Maven Shade Plugin.
- Руководство по плагину Spring Boot для Gradle – Подробности упаковки приложений Spring Boot в исполняемые "толстые" JAR-файлы.
- DZone — Обзор разницы и компромиссов между "толстыми" и "тонкими" JAR-файлами.