web-dev-qa-db-ja.com

別のプロジェクトでSpring Boot Jarに依存関係を追加する方法は?

私はSpring Bootアプリケーションを持っており、それから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をアプリケーションに追加しました。しかし、そのJarでメソッドを呼び出すと、ClassNotFoundExceptionがスローされます。

この問題を修正するにはどうすればよいですか? Spring Boot JARに依存関係を追加するにはどうすればよいですか?

44
sparrow

デフォルトでは、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を作成します。メインのJARは通常のMavenプロジェクトと同じで、2番目のJARは分類子が追加されて実行可能JARになります。

92
Tunaki

@Tunakiが述べたことはほとんど正しいですが、元の質問に基づいて欠けている部分は次のとおりです

これはClassNotFoundExceptionをスローします。スプリングブートアプリケーションで使用される外部jarがありません。

これは、mavenパッケージから作成されたFatJARが、Spring Bootがアプリケーションを実行する方法で機能する特定の場所に指定された依存ライブラリを持っているという事実によるものです。 JARを別のアプリケーションのクラスパスに追加するだけの場合は、@ Tunakiが言ったことを実行し、依存するJARファイルもクラスパスに含める必要があります。これを扱う最良の方法は、 Maven Dependency Plugin を使用して、dependency:copy-dependencies mojoを具体的にターゲットにして、コンパイル時にライブラリパスとして指定できるフォルダーにすべての依存関係をダウンロードすることです。他のアプリケーション。

2
Shawn Clark

Tunakiの答えは正しいが、Spring Boot 2では機能しません。

スプリングブート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>

続きを読む


スプリングブート2.x

spring-boot-starter-parentを使用している場合、repackageゴールはID repackageの実行で自動的に実行されます。そのセットアップでは、次の例に示すように、構成のみを指定する必要があります。

  <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>

続きを読む

2
Andrea Ligios

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つのjarを取得します。主なものは通常のMavenプロジェクトと同じで、2番目のものは分類子にexecが追加され、実行可能JARになります。 3番目のjar名はjar-with-dependenciesによって追加され、スプリングブートアプリケーション(spring-boot-starter-web、thymeleaf、...)に依存関係として追加されたクラスを含むクラスが含まれます。そのプロジェクトをdependencieとして追加するアプリケーションでは、スプリングブートプロジェクトから依存関係を追加する必要はありません。

2

Spring Boot 2では、spring-boot-starter-parentが親として使用されている場合、@ Tunakiの回答は documentation に従って少し修正する必要があります。

<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を使用しないでください。

0
k_o_

バッチランチャーが他のアプリケーションと共有されるjarに依存するようにプロジェクトをセットアップできます。

あなたの最初の要求に従って、異なる言い方をしました:

このJarを他のアプリケーションで使用したいので、このjarをアプリケーションに追加しました。

JarがプロジェクトAであり、アプリケーションがプロジェクトBであるとします。

さて、私が提案するのは、Aから起動部分を削除することです。次に、それを新しいプロジェクトCに配置します。これは、Spring Bootを埋め込み、Aにほぼ完全に依存します。

次に、Aは単純なjarになったため、Bはそれを依存関係として使用できます。

0
dounyy

以下に示すビルドセクションを使用すると、次の3つのことが行われます。

  1. Spring-boot-maven-pluginを使用してスプリングブートjarを作成します
  2. Maven-Assembly-pluginを使用して、ソースコードでコンパイルされたクラスで通常のjarを作成します
  3. 通常のjarをm2フォルダーにローカルにインストールします
  4. 通常のjarをリモートリポジトリにデプロイする場合は、デプロイプラグインを設定します

    <project xmlns="http://maven.Apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-Assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <appendAssemblyId>true</appendAssemblyId>
                            <descriptors>
                                <descriptor>src/main/resources/sources-jar-build.xml</descriptor>
                            </descriptors>
                            <finalName>${pom.artifactId}-${pom.version}</finalName>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                 <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <executions>
                    <execution>
                        <id>install-file</id>
                        <goals>
                            <goal>install-file</goal>
                        </goals>
                        <configuration>
                            <file>${pom.artifactId}-${pom.version}</file>
                            <artifactId>${pom.artifactId}</artifactId>
                            <groupId>${pom.groupId}</groupId>
                            <version>${pom.version}</version>
                        </configuration>
                    </execution>
                </executions>               
            </plugin>
        </plugins>
    </build>
    

「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>
0
Kumar Abhishek