Как добавить зависимость к Spring Boot Jar в другой проект?
У меня есть приложение Spring Boot, и я создал банку из этого. Ниже мой pom.xml
:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- WebJars -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.6.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Я хочу использовать эту банку в моем другом приложении, поэтому добавил эту банку в мое приложение. Но когда я вызываю метод в этой банке, он бросает ClassNotFoundException
.
как я могу исправить эту проблему? Как добавить зависимость к Spring Boot JAR?
4 ответов
по умолчанию Spring Boot переупаковывает ваш JAR в исполняемый JAR, и он делает это, помещая все ваши классы внутри BOOT-INF/classes
и все зависимые библиотеки внутри BOOT-INF/lib
. Следствием создания этой банки жира является то, что вы больше не можете использовать ее в качестве зависимости для других проектов.
С пользовательский классификатор переупаковки:
по умолчанию
repackage
цель заменит исходный артефакт на переупакованный. Это нормальное поведение для модулей, представляющих приложение, но если ваш модуль используется как зависимость от другого модуля,вам нужно предоставить классификатор для переупакованного.причина в том, что классы приложений упакованы в
BOOT-INF/classes
таким образом, зависимый модуль не может загрузить переупакованные классы jar.
если вы хотите сохранить исходный основной артефакт, чтобы использовать его в качестве зависимости, вы можете добавить classifier
в repackage
цель конфигурации:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.1.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
С этой конфигурацией плагин Spring Boot Maven создаст 2 банки: основной будет таким же, как обычный проект Maven, а второй будет иметь добавленный классификатор и будет исполняемым JAR.
то, что @Tunaki заявил, было в основном правильным, но одна недостающая часть, основанная на вашем исходном вопросе, была:
это выбрасывание ClassNotFoundException. Внешняя банка используется в отсутствует приложение spring boot.
это связано с тем, что FatJAR, созданный из упаковки maven, имеет зависимые библиотеки, указанные в определенном месте, которое работает для того, как Spring Boot выполняет приложение. Если вы просто добавляете банку в путь к классам другого приложения, тогда вы должны сделать то, что сказал @Tunaki, а также включить зависимые файлы JAR в путь к классам. Лучший способ работать с этим-использовать Плагин Зависимостей Maven специально направленная против dependency:copy-dependencies
mojo для загрузки всех зависимостей в папку, которую вы можете указать в качестве пути к библиотеке при компиляции другого приложения.
вы можете настроить свои проекты так, чтобы пакетная пусковая установка полагалась на банку, которая будет совместно использоваться с другим приложением.
сказал по-другому, в соответствии с вашим первоначальным запросом:
Я хочу использовать эту банку в моем другом приложении, поэтому добавил эту банку в мое приложение.
Предположим, ваш jar - это ваш проект A, а ваше приложение-Ваш проект B.
теперь, что я предлагаю, это удалить запускающую часть из ; затем вы помещаете его в новый проект C, который будет вставлять Spring Boot, и это будет почти полностью зависеть от A.
тогда, поскольку A теперь простой jar, B может использовать его как зависимость.
вы можете расширить свой проект с помощью Maven-assembly-plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<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>
после сборки вы получите 3 банки. Основной будет таким же, как обычный проект Maven, а второй будет иметь классификатор, добавленный с exec и быть исполняемым JAR. Третье имя jar будет добавлено jar-with-dependencies и будет содержать ваши классы с классами, добавленными в качестве зависимостей в вашем приложении spring boot(spring-boot-starter-web, thymeleaf,...), так В пом приложение, в котором вы хотите добавить этот проект в качестве dependencie вам не придется добавлять зависимости от проекта spring boot.