Как добавить зависимость от Spring Boot Jar в другом проекте?

У меня есть приложение загрузки Spring, и я создал Jar из этого. Ниже приведен мой 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>

Я хочу использовать этот Jar в другом приложении, поэтому добавил эту банку в свое приложение. Но когда я вызываю метод в этом Jar, он бросает ClassNotFoundException.

Как я могу исправить эту проблему? Как добавить зависимость от Spring Boot JAR?

Ответы

Ответ 1

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

Из Пользовательский классификатор переупаковки:

По умолчанию цель 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 JAR: основной будет таким же, как обычный проект Maven, а второй будет иметь добавленный классификатор и быть исполняемым JAR.

Ответ 2

То, что сказал @Tunaki, было в основном правильным, но недостающая часть, основанная на вашем исходном вопросе, была:

Это бросание ClassNotFoundException. Внешняя банка, используемая в spring отсутствует загрузочное приложение.

Это связано с тем, что FatJAR, созданный из упаковки maven, имеет зависимые библиотеки, указанные в определенном месте, которое работает для того, как spring Boot выполняет приложение. Если вы просто добавляете JAR к другому пути класса приложения, тогда вы должны сделать то, что сказал @Tunaki, а также включить зависимые JAR файлы в путь к классам. Лучший способ работать с этим - использовать Maven Dependency Plugin, специально предназначенный для dependency:copy-dependencies mojo для загрузки всех зависимостей в папку, в которую вы может затем указывать в качестве пути к библиотеке при компиляции другого приложения.

Ответ 3

Вы можете расширить свой проект с помощью 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-starter-web, thymeleaf,...), так что в pom Приложение, в которое вы хотите добавить этот проект в качестве зависимости, вам не нужно будет добавлять зависимости из проекта весенней загрузки.

Ответ 4

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

Говоря по-разному, согласно вашему первоначальному запросу:

Я хочу использовать этот Jar в другом приложении, поэтому добавил эту банку в свое приложение.

Скажем, ваша банка - это ваш проект A, а ваше приложение - ваш проект B.

Теперь, что я предлагаю, вы удаляете стартовую часть из A; то вы помещаете его в новый проект C, который будет вставлять Spring Boot, и это будет почти полностью полагаться на A.

Тогда, поскольку A теперь является простым баном, B может использовать его как зависимость.

Ответ 5

Для Spring Boot 2 ответ @Tunaki должен быть немного изменен согласно документации, если в качестве родителя используется spring-boot-starter-parent parent:

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

Не берите лишний <id>repackage</id> необходимый для перезаписи на выполнение из spring-boot-starter-parent.

Ответ 6

Ответ Тунаки правильный, но не работает в Spring Boot 2.

Spring Boot 1.x

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

Прочитайте больше


Spring Boot 2.x

Если вы используете spring-boot-starter-parent, цель repackage выполняется автоматически при выполнении repackage id. В этой настройке должна быть указана только конфигурация, как показано в следующем примере:

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

Прочитайте больше

Ответ 7

Используйте приведенный ниже раздел сборки, он сделает три вещи:

  1. Создайте банку с пружинной загрузкой, используя spring-boot-maven-plugin
  2. Создайте обычный jar с вашими скомпилированными классами исходного кода, используя maven-assembly-plugin
  3. Установите обычный jar в папку m2 локально.
  4. Если вы хотите развернуть обычный jar файл в удаленном хранилище, настройте плагин развертывания.

    org.springframework.boot spring-boot-maven-plugin org.apache.maven.plugins maven-assembly-plugin package один true src/main/resources/sources-jar-build.xml $ {pom.artifactId} - $ {pom.version} org.apache.maven.plugins maven-install-plugin install файл install файл $ {pom.artifactId} - $ {pom.version} $ {pom.artifactId} $ {pom.groupId} $ {pom. версия}


Поместите приведенный ниже контент в файл с именем "sources-jar-build.xml" в папку ресурсов:

<assembly
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <id>sources</id>
    <includeBaseDirectory>false</includeBaseDirectory>

    <formats>
        <format>jar</format>
    </formats>
    <fileSets>
        <fileSet>
            <directory>${project.basedir}/target/classes</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

Ответ 8

Любой проект, если вы хотите добавить в качестве зависимости, вам нужен этот проект <groupId>, <artifactId>, <version>, с этими деталями вы можете добавить свой проект в качестве зависимости в другой модуль или приложение, например: подробности вашего приложения.

<project 
        <groupId>com.sample</groupId>
        <artifactId>sampleapp</artifactId>
        <version>1.0</version>
        <packaging>jar</packaging>
</project>'

ваша зависимость, как показано ниже

 <dependency>
 <groupId>com.sample</groupId>
 <artifactId>sampleapp</artifactId>
 <version>1.0</version>
</dependency>