web-dev-qa-db-ja.com

Mavenを使用してファットjarを作成する

私はjarとして配布したいコードベースを持っています。また、最終的なjarにバンドルしたい外部jarにも依存しています。

maven-Assembly-plug-inを使用してこれを実行できると聞きましたが、その方法がわかりません。誰かが私にいくつかの例を教えてくれますか。

現在、私はファットジャーを使用して最終的なジャーをバンドルしています。 Mavenを使用して同じことを達成したいです。

106
bianca

注:スプリングブートアプリケーションの場合は、回答の最後を読んでください

次のプラグインをpom.xmlに追加します。最新バージョンは https://mvnrepository.com/artifact/org.Apache.maven.plugins/maven-Assembly-plugin にあります。

      ... 
      <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つはプロジェクトクラスのみを含み、もう1つはサフィックス「-jar-with-dependencies」を持つすべての依存関係を持つjarを生成します。

実行時に正しい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>
127
Jigar Joshi

maven-shade-plugin を使用できます。

ビルドでシェードプラグインを設定した後、コマンドmvn packageは、すべての依存関係がマージされた単一のjarを作成します。

52
phlogratos

たぶん、あなたは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>

参照:

35
ggrandes

実際に、追加

<archive>
   <manifest>
    <addClasspath>true</addClasspath>
    <packageName>com.some.pkg</packageName>                     
    <mainClass>com.MainClass</mainClass>
  </manifest>
</archive>

maven-jar-pluginへの宣言は、メインクラスエントリをマニフェストファイルに追加しません。マニフェストで取得するには、maven-Assembly-pluginに追加する必要がありました

9
user3169330

パッケージには onejar-maven-plugin を使用できます。基本的に、プロジェクトjarファイルだけでなく、「jar of jars」としてのすべての外部依存関係も含めて、プロジェクトとその依存関係を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を使用して公開します。

5
matsev

別の方法は、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>
1
Stanislav