Что такое Fat JAR (Uber JAR) и как его создать?

«Что такое Fat JAR (Uber JAR) и как его создать?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Fat JAR (или Uber JAR, Shadow JAR) — это исполняемый JAR-архив, который содержит не только скомпилированные классы вашего приложения, но и все его зависимости (библиотеки из META-INF, lib и т.д.), упакованные в один файл.

Зачем это нужно? Упрощает развертывание: для запуска приложения требуется только JRE и один файл JAR, без необходимости отдельно управлять библиотеками.

Как создать с помощью Maven:

  1. Плагин maven-assembly-plugin:

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.example.Main</mainClass> <!-- Укажите главный класс -->
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    После mvn clean package в target/ появится your-artifact-jar-with-dependencies.jar.

  2. Плагин spring-boot-maven-plugin (для Spring Boot): Создает Fat JAR по умолчанию.

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

Недостатки Fat JAR:

  • Размер: Файл становится очень большим.
  • Конфликты: Возможны конфликты файлов (например, META-INF/MANIFEST.MF или spring.factories) из разных библиотек.
  • Обновления: Для обновления одной библиотеки необходимо пересобрать и переразвернуть весь JAR.

Альтернатива: Использование модульной системы (JPMS) или сборка с помощью jlink для создания минимального образа среды выполнения.