私は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に依存関係を追加するにはどうすればよいですか?
デフォルトでは、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になります。
@Tunakiが述べたことはほとんど正しいですが、元の質問に基づいて欠けている部分は次のとおりです
これはClassNotFoundExceptionをスローします。スプリングブートアプリケーションで使用される外部jarがありません。
これは、mavenパッケージから作成されたFatJARが、Spring Bootがアプリケーションを実行する方法で機能する特定の場所に指定された依存ライブラリを持っているという事実によるものです。 JARを別のアプリケーションのクラスパスに追加するだけの場合は、@ Tunakiが言ったことを実行し、依存するJARファイルもクラスパスに含める必要があります。これを扱う最良の方法は、 Maven Dependency Plugin を使用して、dependency:copy-dependencies
mojoを具体的にターゲットにして、コンパイル時にライブラリパスとして指定できるフォルダーにすべての依存関係をダウンロードすることです。他のアプリケーション。
Tunakiの答えは正しいが、Spring Boot 2では機能しません。
<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-starter-parent
を使用している場合、repackage
ゴールはIDrepackage
の実行で自動的に実行されます。そのセットアップでは、次の例に示すように、構成のみを指定する必要があります。
<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>
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として追加するアプリケーションでは、スプリングブートプロジェクトから依存関係を追加する必要はありません。
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
を使用しないでください。
バッチランチャーが他のアプリケーションと共有されるjarに依存するようにプロジェクトをセットアップできます。
あなたの最初の要求に従って、異なる言い方をしました:
このJarを他のアプリケーションで使用したいので、このjarをアプリケーションに追加しました。
JarがプロジェクトAであり、アプリケーションがプロジェクトBであるとします。
さて、私が提案するのは、Aから起動部分を削除することです。次に、それを新しいプロジェクトCに配置します。これは、Spring Bootを埋め込み、Aにほぼ完全に依存します。
次に、Aは単純なjarになったため、Bはそれを依存関係として使用できます。
以下に示すビルドセクションを使用すると、次の3つのことが行われます。
通常の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>