Mavenを使用して太い瓶を作成する


118

jarとして配布したいコードベースがあります。また、最終的なjarにバンドルしたい外部jarにも依存しています。

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

現在、Fat jarを使用して最終的なjarをバンドルしています。Mavenを使用して同じことを達成したいと思います。

回答:


143

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

あなたにプラグイン以下を追加し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-with-dependencies」のサフィックスが付いた2番目のファット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>

1
このプラグインの現在のバージョンは2.4です
2013年

13
これは現在非推奨であり、代わりにmaven-shade-pluginを使用する必要があります。@phlogratosの回答をご覧ください:stackoverflow.com/a/16222965/274350
Richard Neish、2014

2
maven-assembly-pluginはファットジャーのサイズを最小化できますか?
May12

1
@Richard廃止予定はどこにありますか?ここ周辺には何も見つかりませんでしたmaven.apache.org/plugins/maven-assembly-plugin
user3833308

3
@ user3833308「非推奨」間違った言葉かもしれませんが、でドキュメントmaven.apache.org/plugins/maven-assembly-pluginは、あなたのプロジェクトがユーバー-瓶にあなたのアーティファクトをパッケージ化したい場合は、アセンブリのプラグインは、基本的な提供」と言いますサポート。より細かく制御するには、Maven Shadeプラグインを使用してください。」
Richard Neish 2018年

55

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

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


9
これが正しい方法です。maven-assembly-pluginのドキュメントには、「プロジェクトでアーティファクトをuber-jarにパッケージ化する場合、アセンブリプラグインは基本的なサポートのみを提供します。より細かく制御するには、Maven Shadeプラグインを使用してください。」
Richard Neish、2014

しかし、どのようにしてその単一の.jarを取得して公開に使用するのでしょうか。
DanGordon 2018年

42

おそらく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>

参照:


遭遇した場合はProvider org.apache.xerces.jaxp.SAXParserFactoryImpl not found、単に削除し<minimizeJar>true</minimizeJar>ます。
koppor 2017

「java.lang.SecurityException:Invalid signature file digest for Manifest main attributes」という例外が発生した場合は、上記の構成セクションへのこの追加が役立ちます:stackoverflow.com/a/6743609/38368
Danny Varod

12

実際には、

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

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


5

パッケージ化にはonejar-maven-pluginを使用できます。基本的には、プロジェクトとその依存関係を1つのjarとしてアセンブルします。これには、プロジェクトのjarファイルだけでなく、すべての外部依存関係も「jarの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ます。


パッケージ化する依存関係を選択することは可能ですか?たとえば、a.jarとb.jarが外部jarであり、a.jarのみを最終的なjarにパッケージ化したい場合、それは可能/構成可能ですか?
bianca

また、1つのjarのものが最終的なjarにもバンドルされているのがわかります。これにより、最終的なjarファイルのサイズが大幅に増加しました。最終的なjarファイルに含める予定の外部jarファイルを選択することは可能ですか?次に、1つのjarログを示します。pastebin.com
bianca

何が含まれているかを構成できるかどうかはわかりません。基本的に、1つのjarには、プロジェクトによって指定されたすべての依存関係が含まれます。「jar of jars」構造でJavaを動作させるために、1つのjarによっていくらかのオーバーヘッドが追加されます。
matsev 2013

2

別の方法は、maven シェードプラグインを使用してを構築すること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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.