«1. Обзор

В этом руководстве мы увидим, как использовать приложение Spring Boot в качестве зависимости от другого проекта.

2. Упаковка Spring Boot

Плагины Spring Boot Maven и Gradle упаковывают наше приложение в виде исполняемых JAR-файлов — такой файл нельзя использовать в другом проекте, поскольку файлы классов помещаются в BOOT-INF/classes . Это не баг, а фича.

Чтобы использовать классы совместно с другим проектом, лучше всего создать отдельный jar-файл, содержащий общие классы, а затем сделать его зависимым для всех модулей, которые на них полагаются.

Но если это невозможно, мы можем настроить плагин для создания отдельного jar-файла, который можно использовать в качестве зависимости.

2.1. Конфигурация Maven

Давайте настроим плагин с помощью классификатора:

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

Хотя конфигурация для Spring Boot 1.x будет немного другой:

...
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
            <configuration>
                <classifier>exec</classifier>
            </configuration>
        </execution>
    </executions>
</plugin>

Это создаст два jar-файла, один с суффикс exec в качестве исполняемого jar-файла, а другой — в качестве более типичного jar-файла, который мы можем включить в другие проекты.

3. Упаковка с помощью плагина сборки Maven

Мы также можем использовать плагин maven-assembly-plugin для создания зависимого jar:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Если мы используем этот плагин вместе с классификатором exec в spring-boot- maven-plugin, он сгенерирует три jar-файла. Первые два будут такими же, как мы видели ранее.

Третий будет иметь тот суффикс, который мы указали в теге \u003cdescriptorRef\u003e, и будет содержать все транзитивные зависимости проекта. Если мы включим его в другой проект, нам не нужно будет отдельно включать зависимости Spring.

4. Заключение

В этой статье мы показали несколько подходов к упаковке приложения Spring Boot для использования в качестве зависимости в других проектах Maven.

Как всегда, код статьи доступен на GitHub.