135

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

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

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

4

6 に答える 6

167

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

次のプラグインをあなたに追加してください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>
于 2013-04-25T19:17:10.247 に答える
50

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

参考文献:

于 2014-05-29T15:43:10.320 に答える
14

実際には、

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

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

于 2014-06-27T18:06:51.780 に答える
5

パッケージ化には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ます。

于 2013-04-25T19:32:19.283 に答える
2

別の方法として、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>
于 2016-11-30T20:15:34.627 に答える