Mavenを使用して依存関係を持つ実行可能JARを作成するにはどうすればよいですか?


2397

配布用にプロジェクトを単一の実行可能JARにパッケージ化したい。

Mavenプロジェクトパッケージをすべての依存関係JARを出力JARに作成するにはどうすればよいですか?


14
参照している依存プラグインの目的を説明してください。私は、元の質問が要求することを実行する目標を知りません:すべての依存関係をA)再パッケージ化によって著者のjar内に入れるか、またはB)MANIFEST.MFのクラスパスに他のものを含む実行可能なjarを作成します
マシューマッカロウ



回答:


2360
<build>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <mainClass>fully.qualified.MainClass</mainClass>
          </manifest>
        </archive>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
      </configuration>
    </plugin>
  </plugins>
</build>

そして、あなたはそれを実行します

mvn clean compile assembly:single

コンパイルの目標は、アセンブリの前に追加する必要があります:単一またはそれ以外の場合、独自のプロジェクトのコードは含まれません。

コメントで詳細をご覧ください。


通常、この目標は、自動的に実行されるビルドフェーズに関連付けられています。これにより、mvn installデプロイメント/リリースを実行または実行するときにJARが構築されます。

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <mainClass>fully.qualified.MainClass</mainClass>
      </manifest>
    </archive>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
  </configuration>
  <executions>
    <execution>
      <id>make-assembly</id> <!-- this is used for inheritance merges -->
      <phase>package</phase> <!-- bind to the packaging phase -->
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
</plugin>

22
@IAdapterに感謝します。JARの "target / classes"にあるものを何でも置くだけなので、常に事前にコンパイルする必要があることに注意してください。これにより、ソースコードに最近加えた変更がJARに確実に含まれます。したがって、次のようにする必要がありますmvn clean compile assembly:single
マイケル、

10
フェーズバインディングを含めるように質問を編集しました。誰もそれについて知る必要がないので、私は非推奨のアセンブリ目標を削除しました。
ダンカンジョーンズ

2
これはjarをuber jarに追加するのではなく、すべてのクラスファイルをjarに追加するだけです。
pitchblack408

170
ヒント:要素<appendAssemblyId>false</appendAssemblyId>をに追加configurationして、名前の迷惑な「-jar-with-dependencies」サフィックスを回避することもできます
maxivis

6
忘れてcompile、あなたはねじ込まれています。
prayagupd 2016年

350

dependency-pluginを使用して、パッケージフェーズの前に別のディレクトリにすべての依存関係を生成し、それをマニフェストのクラスパスに含めることができます。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>theMainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

または${project.build.directory}/classes/lib、OutputDirectoryとして使用して、すべてのjarファイルをメインjarに統合しますが、その後、jarをロードするカスタムクラスローディングコードを追加する必要があります。


3
+1すばらしい。maven-assembly-pluginの代わりにmaven-dependency-pluginを使用するのは、buildnumber-maven-pluginも使用しているためであり、これにより、各jarのマニフェストにバージョン番号を個別に格納できます。
PapaFreud 2011

17
私はあなたの解決策が好きです。内部にすべての依存関係を持つ1つのメイン.jarがある${project.build.directory}/classes/libように使用outputDirectoryしますが、このjarをロードするカスタムクラスロードコードを追加するにはどうすればよいですか。次のような作業を実行する必要がありますjava -jar main-jar-with-deps.jar。これは可能ですか?
marioosh 2012年

3
@AndréAronsen、私はこのソリューションを使用して、jar内のlibフォルダーに依存関係を追加しましたが、常にclass not found例外が発生します。それを修正する方法を教えてください。
Mahmoud Saleh

11
あなたに+1!Mavenアセンブリプラグイン「jar-with-dependencies」は実際にはうまく機能しないようです。生成されたjarのMETA-INF / spring.schemasからいくつかのエントリが欠落していました。したがって、依存関係のあるjarファイルを破棄し、上記のソリューションを使用しました。ありがとうございます!!!
デレク

9
この問題に遭遇した他の誰にとっても、jarの転送先であるjarと同じディレクトリにlibフォルダーを含める必要があります。
Sparticles 2014年

224

これを行ういくつかの異なる方法についてブログを書いた。

Apache Maven(WordPress)で実行可能なJARを参照してください。

または実行可能なjar-with-maven-example(GitHub)

ノート

これらの長所と短所は、ステファンによって提供されます。


手動展開の場合

  • 長所
  • 短所
    • 依存関係は最終的なjarの外にあります。

依存関係を特定のディレクトリにコピーする

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>copy-dependencies</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>copy-dependencies</goal>
      </goals>
      <configuration>
        <outputDirectory>${project.build.directory}/${project.build.finalName}.lib</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

JAR実行可能ファイルとクラスパスを認識させる

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <addClasspath>true</addClasspath>
        <classpathPrefix>${project.build.finalName}.lib/</classpathPrefix>
        <mainClass>${fully.qualified.main.class}</mainClass>
      </manifest>
    </archive>
  </configuration>
</plugin>

この時点で、jar実際には外部クラスパス要素で実行可能です。

$ java -jar target/${project.build.finalName}.jar

展開可能なアーカイブを作成する

jarファイルには、兄弟でのみ実行可能である...lib/ディレクトリ。ディレクトリとそのコンテンツとともにデプロイするアーカイブを作成する必要があります。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-antrun-plugin</artifactId>
  <executions>
    <execution>
      <id>antrun-archive</id>
      <phase>package</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <target>
          <property name="final.name" value="${project.build.directory}/${project.build.finalName}"/>
          <property name="archive.includes" value="${project.build.finalName}.${project.packaging} ${project.build.finalName}.lib/*"/>
          <property name="tar.destfile" value="${final.name}.tar"/>
          <zip basedir="${project.build.directory}" destfile="${final.name}.zip" includes="${archive.includes}" />
          <tar basedir="${project.build.directory}" destfile="${tar.destfile}" includes="${archive.includes}" />
          <gzip src="${tar.destfile}" destfile="${tar.destfile}.gz" />
          <bzip2 src="${tar.destfile}" destfile="${tar.destfile}.bz2" />
        </target>
      </configuration>
    </execution>
  </executions>
</plugin>

これtarget/${project.build.finalName}.(zip|tar|tar.bz2|tar.gz)で、それぞれにjarおよびが含まれていますlib/*


Apache Mavenアセンブリプラグイン

  • 長所
  • 短所
    • クラスの再配置はサポートされていません(クラスの再配置が必要な場合はmaven-shade-pluginを使用してください)。
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <archive>
          <manifest>
            <mainClass>${fully.qualified.main.class}</mainClass>
          </manifest>
        </archive>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
      </configuration>
    </execution>
  </executions>
</plugin>

あなたが持っていtarget/${project.bulid.finalName}-jar-with-dependencies.jarます。


Apache Maven Shadeプラグイン

  • 長所
  • 短所
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <shadedArtifactAttached>true</shadedArtifactAttached>
        <transformers>
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>${fully.qualified.main.class}</mainClass>
          </transformer>
        </transformers>
      </configuration>
    </execution>
  </executions>
</plugin>

あなたが持っていtarget/${project.build.finalName}-shaded.jarます。


onejar-maven-plugin

  • 長所
  • 短所
    • 2012年以降積極的にサポートされていません。
<plugin>
  <!--groupId>org.dstovall</groupId--> <!-- not available on the central -->
  <groupId>com.jolira</groupId>
  <artifactId>onejar-maven-plugin</artifactId>
  <executions>
    <execution>
      <configuration>
        <mainClass>${fully.qualified.main.class}</mainClass>
        <attachToBuild>true</attachToBuild>
        <!-- https://code.google.com/p/onejar-maven-plugin/issues/detail?id=8 -->
        <!--classifier>onejar</classifier-->
        <filename>${project.build.finalName}-onejar.${project.packaging}</filename>
      </configuration>
      <goals>
        <goal>one-jar</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Spring Boot Mavenプラグイン

  • 長所
  • 短所
    • 潜在的に不要なSpringおよびSpring Boot関連のクラスを追加します。
<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>repackage</goal>
      </goals>
      <configuration>
        <classifier>spring-boot</classifier>
        <mainClass>${fully.qualified.main.class}</mainClass>
      </configuration>
    </execution>
  </executions>
</plugin>

あなたが持っていtarget/${project.bulid.finalName}-spring-boot.jarます。


2
@caiohamamura GitHubリポジトリのクローンを作成して、すべてのプロファイルがどのように機能するかを確認できます。
ジンクォン・

問題は私が使用していたパッケージにありました:stackoverflow.com/a/12622037/2548351
caiohamamura

1
これがおそらくこのトピックに対する最も完全な答えだと思います。
PetrBodnár19年

139

Unansweredの回答を取り入れて再フォーマットすると、次のようになります。

<build>
    <plugins>
        <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>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>
    </plugins>
</build>

次に、明示的に呼び出すのではなく、これをビルドの自然な部分にすることをお勧めします。これをビルドの不可欠な部分にするには、このプラグインをに追加pom.xmlして、packageライフサイクルイベントにバインドします。ただし、問題assembly:singleは、pom.xmlに配置する場合は目標を呼び出す必要があることですが、コマンドラインから手動で実行する場合は「assembly:assembly」を呼び出すことになります。

<project>
  [...]
  <build>
      <plugins>
          <plugin>
              <artifactId>maven-assembly-plugin</artifactId>
              <configuration>
                  <archive>
                      <manifest>
                          <addClasspath>true</addClasspath>
                          <mainClass>fully.qualified.MainClass</mainClass>
                      </manifest>
                  </archive>
                  <descriptorRefs>
                      <descriptorRef>jar-with-dependencies</descriptorRef>
                  </descriptorRefs>
              </configuration>
              <executions>
                  <execution>
                      <id>make-my-jar-with-dependencies</id>
                      <phase>package</phase>
                      <goals>
                          <goal>single</goal>
                      </goals>
                  </execution>
              </executions>
          </plugin>
      [...]
      </plugins>
    [...]
  </build>
</project>

10
この回答のアプローチを使用すると、「java -jar <jar file>」を使用してJARを実行しようとすると、「Failed to load Main-Class manifest attribute from <jar file>」というエラーメッセージが表示されます
Elmo

3
maven-jar-pluginのアーカイブ部分が必要です<archive> <manifest> <addClasspath> true </ addClasspath> <mainClass> fully.qualified.MainClass </ mainClass> </ manifest> </ archive>
Rade_303

4
申し訳ありませんが、この答えは間違いです。mainClassタグはmaven-assembly-pluginエントリにある必要があります。これは、パッケージゴールの間に呼び出すためです
Alex Lehmann

驚いたのですが、mvn archetype:generateコマンドの後にpom.xmlにこれを含められないのはなぜですか?新しいmavenプロジェクトを作成するたびに、これを手動でコピーして貼り付けるのはちょっと面倒です...
wintermute

メインメソッドやクラスはありませんが、機能を持つクラスがあります。jarを作成して使用する方法
18

97

maven-shade-pluginを使用して、すべての依存関係を1つのuber-jarにパッケージ化します。また、メインクラスを指定して実行可能なjarを構築するために使用することもできます。maven-assemblyとmaven-jarを使用しようとしたところ、このプラグインが自分のニーズに最適であることがわかりました。

このプラグインは、特定のファイルのコンテンツを上書きするのではなくマージするので、特に便利です。これは、jar間で同じ名前のリソースファイルがあり、プラグインがすべてのリソースファイルをパッケージ化しようとする場合に必要です。

以下の例を参照してください

      <plugins>
    <!-- This plugin provides the capability to package the artifact in an uber-jar, including its dependencies and to shade - i.e. rename - the packages of some of the dependencies. -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <artifactSet>
                        <!-- signed jars-->
                            <excludes>
                                <exclude>bouncycastle:bcprov-jdk15</exclude>
                            </excludes>
                        </artifactSet>

                         <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <!-- Main class -->
                                <mainClass>com.main.MyMainClass</mainClass>
                            </transformer>
                            <!-- Use resource transformers to prevent file overwrites -->
                            <transformer 
                                 implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>properties.properties</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                                <resource>applicationContext.xml</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/cxf/cxf.extension</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                                <resource>META-INF/cxf/bus-extensions.xml</resource>
                            </transformer>
                     </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>

    </plugins>

では、シェーディングプロセスから除外されている場合、bcprov-jdk15.jarは実行時にクラスパスにどのように入るのでしょうか。
Andrew Swan

それは私の依存関係の一部であるcxf-rt-ws-securityによって引っ張られていました
Vijay Katam

これまでこのプラグインについて聞いたことがありませんが、jar内のspring.handlersに関する私の問題は解決しました。ありがとう!
アレクサンドルLテルズ

11
セキュリティ例外が発生した場合は、マニフェストからDSAを除外します。maven.apache.org/plugins/maven-shade-plugin/examples/…を
ruhsuzbaykus

1私がminijar使用している:過去にueberjarを、しかしminijarプラグインは廃止し、日陰で置き換えられる
RDS

19

Mavenアセンブリプラグインを長い間使用していましたが、に関する問題の解決策を見つけることができませんでした"already added, skipping"。今、私は別のプラグインを使用しています-onejar-maven-plugin。以下の例(mvn packagejarのビルド):

<plugin>
    <groupId>org.dstovall</groupId>
    <artifactId>onejar-maven-plugin</artifactId>
    <version>1.3.0</version>
    <executions>
        <execution>
            <configuration>
                <mainClass>com.company.MainClass</mainClass>
            </configuration>
            <goals>
                <goal>one-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

そのプラグインのリポジトリを追加する必要があります:

<pluginRepositories>
    <pluginRepository>
        <id>onejar-maven-plugin.googlecode.com</id>
        <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
    </pluginRepository>
</pluginRepositories>

出力内の余分なメッセージを取り除く方法は?
Alexandr

17

maven-dependency-pluginを使用できますが、問題は実行可能JARを作成する方法でした。これを行うには、Matthew Franglenの応答を次のように変更する必要があります(ところで、依存関係プラグインを使用すると、クリーンなターゲットから開始するときにビルドに時間がかかります)。

<build>
    <plugins>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>fully.qualified.MainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>unpack-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>unpack-dependencies</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>${basedir}/target/dependency</directory>
        </resource>
    </resources>
</build>

16

maven-shadeプラグインを使用して、以下のようなuber jarを構築できます

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
</plugin>

しかし、これはどのようにレポにデプロイされるのでしょうか?
Francesco Gualazzi

15

結果の単一のJAR内に他のJARコンテンツを再パッケージ化する場合のもう1つのオプションは、Mavenアセンブリプラグインです。を使用して、すべてを解凍してからディレクトリに再パックします<unpack>true</unpack>。次に、それを1つの巨大なJARに構築する2番目のパスがあります。

別のオプションはOneJarプラグインです。これにより、上記の再パッケージ化アクションがすべて1つのステップで実行されます。


14

以下をpom.xmlに追加できます。

<build>
<defaultGoal>install</defaultGoal>
<plugins>
  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
      <source>1.6</source>
      <target>1.6</target>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.3.1</version>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.mycompany.package.MainClass</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>
  <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>com.mycompany.package.MainClass</mainClass>
        </manifest>
      </archive>
    </configuration>
    <executions>
      <execution>
        <id>make-my-jar-with-dependencies</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>
</build>

その後、コンソールを介してpom.xmlが配置されているディレクトリに切り替える必要があります。次に、mvn assembly:singleを実行する必要があります。その後、依存関係を持つ実行可能JARファイルがビルドされます。cd ./targetを使用して出力(ターゲット)ディレクトリーに切り替え、jarをjava -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jarに類似したコマンドで開始するときに確認できます。

これをApache Maven 3.0.3でテストしました。


13

すべての依存関係を含む太い実行可能jarを作成するために、これらのすべての応答を調べましたが、どれも正しく機能しませんでした。答えは、シェードプラグインで、非常に簡単でわかりやすいものです。

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>2.3</version>
      <executions>
         <!-- Run shade goal on package phase -->
        <execution>
        <phase>package</phase>
        <goals>
            <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
             <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>path.to.MainClass</mainClass>
             </transformer>
          </transformers>
        </configuration>
          </execution>
      </executions>
    </plugin>

これが正しく機能するには、依存関係にコンパイルまたはランタイムのスコープが必要であることに注意してください。

この例はmkyong.comからのものです


これを修正したので、レビューを更新していただけませんか。私は投稿する前にあなたの考えを考慮に入れていなかったので、あなたのコメントを見てすぐに修正しました
dsutherland

2
plugin要素はに行くpom.xmlの下でbuild/plugins
isapir 2017

12

あなたは組み合わせることができmaven-shade-pluginmaven-jar-plugin

  • maven-shade-plugin単一のJARファイルにあなたのクラスとすべての依存関係をパックします。
  • maven-jar-plugin実行可能jarのメインクラスを指定するようにを構成します(「クラスパスの設定」の章「Jarを実行可能にする」を参照)。

のPOM構成の例maven-jar-plugin

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>com.example.MyMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

最後に、次のコマンドを実行して実行可能なjarを作成します。

mvn clean package shade:shade

3
:今すぐプラグインのシェードは、マニフェストにメインクラスのエントリを指定する手段があるmaven.apache.org/plugins/maven-shade-plugin/examples/...
チャドウィック

9

ケン・リューは私の意見ではそれを正しく理解しています。maven依存関係プラグインを使用すると、すべての依存関係を拡張して、リソースとして扱うことができます。これにより、それらをメインアーティファクトに含めることができます。アセンブリプラグインを使用すると、変更が難しい2次的なアーティファクトが作成されます-私の場合、カスタムマニフェストエントリを追加したいと思いました。私のポンは次のように終わった:

<project>
 ...
 <build>
  <plugins>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
     <execution>
      <id>unpack-dependencies</id>
      <phase>package</phase>
      <goals>
       <goal>unpack-dependencies</goal>
      </goals>
     </execution>
    </executions>
   </plugin>
  </plugins>
  ...
  <resources>
   <resource>
    <directory>${basedir}/target/dependency</directory>
    <targetPath>/</targetPath>
   </resource>
  </resources>
 </build>
 ...
</project>

1
すごくいい!ただし、アンパックには、generate-resourcesフェーズを使用する方がよいのではないでしょうか。
nawroth 2013

9

それはそのようでなければなりません:

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>unpack-dependencies</id>
            <phase>generate-resources</phase>
            <goals>
                <goal>unpack-dependencies</goal>
            </goals>
        </execution>
    </executions>
</plugin>

パッケージ化フェーズの場合、リソースとして含まれないため、アンパックはリソース生成フェーズで行う必要があります。クリーンなパッケージを試してみてください。


7

maven-assembly-plugin-2.2.1で共有アセンブリファイルを検索する際の問題?

descriptors / descriptorまたはdescriptorRefs / descriptorRefパラメータの代わりにdescriptorId設定パラメータを使用してみてください。

どちらも必要なことを行いません。クラスパスでファイルを探します。もちろん、共有アセンブリが存在するパッケージをmaven-assembly-pluginのクラスパスに追加する必要があります(以下を参照)。Maven 3.xではなくMaven 2.xを使用している場合は、pluginManagementセクションの最上位の親pom.xmlにこの依存関係を追加する必要がある場合があります。

詳細はこちらをご覧ください。

クラス:org.apache.maven.plugin.assembly.io.DefaultAssemblyReader

例:

        <!-- Use the assembly plugin to create a zip file of all our dependencies. -->
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2.1</version>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <descriptorId>assembly-zip-for-wid</descriptorId>
                    </configuration>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>cz.ness.ct.ip.assemblies</groupId>
                    <artifactId>TEST_SharedAssemblyDescriptor</artifactId>
                    <version>1.0.0-SNAPSHOT</version>
                </dependency>
            </dependencies>
        </plugin>

7

この問題を解決するために、依存関係JARと一緒にJARを作成して単一の実行可能JARファイルにするMavenアセンブリプラグインを使用します。以下のプラグイン設定をpom.xmlファイルに追加するだけです。

<build>
   <pluginManagement>
      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
               <archive>
                  <manifest>
                     <addClasspath>true</addClasspath>
                     <mainClass>com.your.package.MainClass</mainClass>
                  </manifest>
               </archive>
               <descriptorRefs>
                  <descriptorRef>jar-with-dependencies</descriptorRef>
               </descriptorRefs>
            </configuration>
            <executions>
               <execution>
                  <id>make-my-jar-with-dependencies</id>
                  <phase>package</phase>
                  <goals>
                     <goal>single</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
      </plugins>
   </pluginManagement>
</build>

これを行った後、このコマンドでMAVENツールを実行することを忘れないでくださいmvn clean compile assembly:single

http://jkoder.com/maven-creating-a-jar-together-with-its-dependency-jars-into-a-single-executable-jar-file/


5

他の人が以前にそれを行ったので、私は直接質問に答えませんが、プロジェクトのjar自体にすべての依存関係を埋め込むのは良い考えだと思います。

私は要点はわかります(展開/使用の容易さ)が、それはあなたのプロジェクトのユースケースに依存します(そして代替案があるかもしれません(下記参照))。

完全にスタンドアロンで使用するのであれば、なぜでしょうか。

しかし、プロジェクトを他のコンテキスト(Webアプリケーションなど、または他のjarが置かれているフォルダーにドロップ)で使用する場合、クラスパス(フォルダー内のもの、jar内のもの)にjarの重複がある可能性があります。多分入札取引ではないかもしれませんが、私は通常これを避けます。

良い選択肢:

  • アプリケーションを.zip / .warとしてデプロイします。アーカイブにはプロジェクトのjarとすべての依存jarが含まれます。
  • 動的なクラスローダーメカニズム(Springを参照、または自分で簡単に実行できます)を使用して、プロジェクトの単一のエントリポイント(開始する単一のクラス-別の回答のマニフェストメカニズムを参照)を使用します。他のすべての必要なjarの現在のクラスパス。

このように、最終的にはマニフェストと「特別な動的クラスローダーメイン」だけで、プロジェクトを次のように開始できます。

java -jar ProjectMainJar.jar com.stackoverflow.projectName.MainDynamicClassLoaderClass

1
プロジェクトのjarとすべての依存jarをアーカイブに入れる方法は?

4

コマンドライン自体から実行可能JARを作成するには、プロジェクトパスから次のコマンドを実行します。

mvn assembly:assembly

3
私はあなたがまだで、いくつかのものを行うために必要があると思うpom.xmlそうあなたが得ますError reading assemblies: No assembly descriptors found.。とにかくそれが私に起こります。
Sridhar Sarnobat

3

これは私が見つけた最良の方法です:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
      <archive>
        <manifest>
        <addClasspath>true</addClasspath>
        <mainClass>com.myDomain.etc.MainClassName</mainClass>
        <classpathPrefix>dependency-jars/</classpathPrefix>
        </manifest>
      </archive>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.5.1</version>
    <executions>
      <execution>
        <id>copy-dependencies</id>
        <phase>package</phase>
        <goals>
            <goal>copy-dependencies</goal>
        </goals>
        <configuration>
            <outputDirectory>
               ${project.build.directory}/dependency-jars/
            </outputDirectory>
        </configuration>
      </execution>
    </executions>
  </plugin>

この構成では、すべての依存関係がに配置され/dependency-jarsます。私のアプリケーションにはMainクラスがありません。コンテキストクラスだけですが、依存関係の1 つには、JMXサーバーを起動し、またはパラメーターを受け取るMainクラス(com.myDomain.etc.MainClassName)がstartありstopます。だからこれで私はこのように私のアプリケーションを開始することができました:

java -jar ./lib/TestApp-1.0-SNAPSHOT.jar start

皆様のお役に立てれば幸いです。


3

この投稿で述べたツリープラグインを比較しました。2つのjarファイルと、すべてのjarファイルを含むディレクトリを生成しました。結果を比較したところ、間違いなくmaven-shade-pluginが最高です。私の課題は、マージする必要がある複数のSpringリソース、jax-rs、およびJDBCサービスがあることです。これらはすべて、maven-assembly-pluginと比較して、shadeプラグインによって適切にマージされました。その場合、独自のリソースフォルダーにコピーして手動で一度マージしない限り、Springは失敗します。どちらのプラグインも正しい依存関係ツリーを出力します。テスト、提供、コンパイルなどの複数のスコープがあり、テストと提供が両方のプラグインによってスキップされました。どちらも同じマニフェストを生成しましたが、トランスフォーマーを使用して、シェードプラグインでライセンスを統合できました。もちろん、maven-dependency-pluginを使用すると、jarファイルが抽出されないため、これらの問題が発生します。しかし、他の人が指摘したように、適切に機能するには、1つの追加ファイルを運ぶ必要があります。ここにpom.xmlの抜粋があります

            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        <includeScope>compile</includeScope>
                        <excludeTransitive>true</excludeTransitive>
                        <overWriteReleases>false</overWriteReleases>
                        <overWriteSnapshots>false</overWriteSnapshots>
                        <overWriteIfNewer>true</overWriteIfNewer>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>com.rbccm.itf.cdd.poller.landingzone.LandingZonePoller</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-my-jar-with-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <configuration>
                <shadedArtifactAttached>false</shadedArtifactAttached>
                <keepDependenciesWithProvidedScope>false</keepDependenciesWithProvidedScope>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/services/javax.ws.rs.ext.Providers</resource>
                    </transformer>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/spring.factories</resource>
                    </transformer>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/spring.handlers</resource>
                    </transformer>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/spring.schemas</resource>
                    </transformer>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/spring.tooling</resource>
                    </transformer>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"/>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer">
                    </transformer>
                </transformers>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

2

私にとってうまくいったことは:

  <plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
      <execution>
        <id>unpack-dependencies</id>
        <phase>prepare-package</phase>
        <goals>
          <goal>unpack-dependencies</goal>
        </goals>
        <configuration>
          <outputDirectory>${project.build.directory}/classes</outputDirectory>
        </configuration>
      </execution>

    </executions>
  </plugin>


  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <executions>
      <execution>
        <id>unpack-dependencies</id>
        <phase>package</phase>
      </execution>
    </executions>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <classpathPrefix>lib/</classpathPrefix>
          <mainClass>SimpleKeyLogger</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>

私の依存関係がシステム1であったため、私は異常なケースを抱えていました。

<dependency>
  ..
  <scope>system</scope>
  <systemPath>${project.basedir}/lib/myjar.jar</systemPath>
</dependency>

@ user189057が提供するコードを変更して変更しました:1)maven-dependency-pluginが「prepare-package」フェーズで実行されます2)解凍されたクラスを「target / classes」に直接抽出しています


2

私はここで最も投票された回答を試しましたが、jarを実行可能にすることができました。しかし、プログラムは正しく実行されませんでした。その理由はわかりません。から実行しようとするとEclipse、異なる結果が得られますが、jarをコマンドラインから実行すると、異なる結果が得られます(プログラム固有のランタイムエラーでクラッシュします)。

OPと同様の要件がありましたが、プロジェクトに対して(Maven)依存関係が多すぎるということです。幸い、私にとって有効な唯一の解決策は、を使用することEclipseでした。とてもシンプルで簡単です。これはOPの解決策ではありませんが、同様の要件を持っているが多くのMaven依存関係がある人のための解決策です。

1)Eclipse内のプロジェクトフォルダーを右クリックして、 Export

2)次に選択Java->Runnable Jar

3)jarファイルの場所を選択するように求められます

4)最後に、あなたが実行して選択したいことを主なメソッドを持つクラスを選択Package dependencies with the Jar fileし、クリックしてくださいFinish


2

これもオプションになる可能性があります。jarファイルを作成できます

<build>
    <plugins>
        <plugin>
            <!-- Build an executable JAR -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>WordListDriver</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

2

uber-jarから特定の依存関係を除外するオプションを探している人にとって、これは私にとってうまくいった解決策です:

<project...>
<dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>1.6.1</version>
            <scope>provided</scope> <=============
        </dependency>
</dependencies>
<build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>...</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

したがって、これはmvn-assembly-pluginの構成ではなく、依存関係のプロパティです。


2

すでに何百万もの回答があり<mainClass>ます。アプリケーションにentryPointを追加する必要がない場合は、不要なものを追加したいと思います。たとえば、APIには必ずしもmainメソッドがあるとは限りません。

Mavenプラグイン設定

  <build>
    <finalName>log-enrichment</finalName>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
  </build>

建てる

mvn clean compile assembly:single

確認

ll target/
total 35100
drwxrwx--- 1 root vboxsf     4096 Sep 29 16:25 ./
drwxrwx--- 1 root vboxsf     4096 Sep 29 16:25 ../
drwxrwx--- 1 root vboxsf        0 Sep 29 16:08 archive-tmp/
drwxrwx--- 1 root vboxsf        0 Sep 29 16:25 classes/
drwxrwx--- 1 root vboxsf        0 Sep 29 16:25 generated-sources/
drwxrwx--- 1 root vboxsf        0 Sep 29 16:25 generated-test-sources/
-rwxrwx--- 1 root vboxsf 35929841 Sep 29 16:10 log-enrichment-jar-with-dependencies.jar*
drwxrwx--- 1 root vboxsf        0 Sep 29 16:08 maven-status/

2

pom.xmlに追加:

  <dependency>
            <groupId>com.jolira</groupId>
            <artifactId>onejar-maven-plugin</artifactId>
            <version>1.4.4</version>
  </dependency>

そして

<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>

それでおしまい。次のmvnパッケージも、すべての依存関係jarを含む1つのファットjarを追加で作成します。


1

maven-assembly-pluginは私にとってはうまくいきました。私はmaven-dependency-pluginで何時間も過ごしましたが、それを機能させることができませんでした。主な理由は、ドキュメントに記載されているように、含める必要があるアーティファクト項目を構成セクションで明示的に定義する必要があったためです。のように使用したい場合の例があります。には、mvn dependency:copyartifactItemsは含まれていませんが、機能しません。


1

このブログ投稿は、maven-jarプラグインとmaven-assemblyプラグインを組み合わせる別のアプローチを示しています。ブログ投稿のアセンブリ構成xmlを使用すると、依存関係が展開されるか、フォルダに収集され、マニフェストのクラスパスエントリによって参照されるかどうかも制御できます。

理想的なソリューションは、jarをlibフォルダーに含め、メインjarのmanifest.mfファイルにすべてのjarをクラスパスに含めることです。

そして、それはここで説明されています:https : //caffebig.wordpress.com/2013/04/05/executable-jar-file-with-dependent-jars-using-maven/


0
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4.1</version>
            <configuration>
                <!-- get all project dependencies -->
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <!-- bind to the packaging phase -->
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

1
これについてもう少し説明が必要です。これらのコメントは単なるドキュメントですか、それともコメントの場所に追加のオプションを配置する必要がありますか?
マークスチュワート

-2

さて、これが私の解決策です。pom.xmlファイルを使用していないことはわかっています。しかし、プログラムをNetbeansでコンパイルおよび実行するときに問題が発生しましたが、Java -jar MyJarFile.jarを試行すると失敗しました。今、私はMavenを完全には理解していません。これが、Netbeans 8.0.2がjarファイルをライブラリに含めてjarファイルに入れるのに問題があった理由だと思います。EclipseでMavenを使用せずにjarファイルを使用する方法について考えていました。

すべての依存関係とプラグインをコンパイルできるのはMavenです。Netbeansではありません。(Netbeansを入手でき、java .jarを使用してこれを実行できる場合は、方法を教えてください(^。^)v)

[解決済み-Linuxの場合]端末を開く。

その後

cd /MyRootDirectoryForMyProject

mvn org.apache.maven.plugins:maven-compiler-plugin:compile

mvn install

これにより、ターゲットディレクトリにjarファイルが作成されます。

MyJarFile-1.0-jar-with-dependencies.jar

cd target

(実行する必要があるかもしれません: chmod +x MyJarFile-1.0-jar-with-dependencies.jar

そして最後に

java -jar MyJarFile-1.0-jar-with-dependencies.jar

参照してください

https://cwiki.apache.org/confluence/display/MAVEN/LifecyclePhaseNotFoundException

この解決策は、同様の問題がある他のいくつかのページに投稿します。うまくいけば、1週間の不満から誰かを救うことができます。


2
Netbeansで作成したMavenプロジェクトを開いてみてください。Netbeansの基本的なルールは常にMavenプロジェクトを作成することであり、「Javaアプリケーション」を作成することは決してありません。答えの1つのようにmaven-shade-pluginを追加します。魅力のように機能します。
rjdkolb 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.