jar として配布したいコードベースがあります。また、最終的なjarにバンドルしたい外部jarにも依存しています。
これは を使用して実行できると聞きましたがmaven-assembly-plug-in
、方法がわかりません。誰かが私にいくつかの例を教えてくれませんか。
現在、最終的な jar をバンドルするために fat jar を使用しています。Mavenを使用して同じことを達成したい。
jar として配布したいコードベースがあります。また、最終的なjarにバンドルしたい外部jarにも依存しています。
これは を使用して実行できると聞きましたがmaven-assembly-plug-in
、方法がわかりません。誰かが私にいくつかの例を教えてくれませんか。
現在、最終的な jar をバンドルするために fat jar を使用しています。Mavenを使用して同じことを達成したい。
注:スプリングブートアプリケーションの場合は、回答の最後をお読みください
次のプラグインをあなたに追加してくださいpom.xml
。最新バージョンは次の場所にあります。
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>CHOOSE LATEST VERSION HERE</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>assemble-all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
このプラグインを構成した後、実行mvn package
すると 2 つの jar が生成されます。1 つはプロジェクト クラスのみを含み、2 番目のファット jar は接尾辞「-jar-with-dependencies」が付いたすべての依存関係を含みます。
classpath
実行時に正しいセットアップが必要な場合は、次のプラグインも追加します
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
スプリング ブート アプリケーションの場合は、次のプラグインを使用します (適切なバージョンを選択してください)。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<mainClass>${start-class}</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
おそらくmaven-shade-plugin
、依存関係をバンドルし、未使用のコードを最小限に抑え、外部の依存関係を非表示にして、競合を回避します。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<minimizeJar>true</minimizeJar>
<createDependencyReducedPom>true</createDependencyReducedPom>
<dependencyReducedPomLocation>
${java.io.tmpdir}/dependency-reduced-pom.xml
</dependencyReducedPomLocation>
<relocations>
<relocation>
<pattern>com.acme.coyote</pattern>
<shadedPattern>hidden.coyote</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
参考文献:
実際には、
<archive>
<manifest>
<addClasspath>true</addClasspath>
<packageName>com.some.pkg</packageName>
<mainClass>com.MainClass</mainClass>
</manifest>
</archive>
maven-jar-plugin への宣言は、メイン クラスのエントリをマニフェスト ファイルに追加しません。マニフェストでそれを取得するには、maven-assembly-plugin に追加する必要がありました
パッケージ化にはonejar-maven-pluginを使用できます。基本的に、プロジェクトのjarファイルだけでなく、すべての外部依存関係を「jarのjar」として含む、プロジェクトとその依存関係を1つのjarとして組み立てます。
<build>
<plugins>
<plugin>
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
注 1: 構成オプションは、プロジェクトのホームページで利用できます。
注 2: 何らかの理由で、onejar-maven-plugin プロジェクトは Maven Central で公開されていません。ただし、 jolira.comは元のプロジェクトを追跡し、 groupId を使用して公開しcom.jolira
ます。
別の方法として、maven shadeプラグインを使用してuber-jar
.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version> Your Version Here </version>
<configuration>
<!-- put your configurations here -->
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>