Как добавить зависимость к 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.