web-dev-qa-db-ja.com

Mavenを使用して依存関係を持つ実行可能JARを作成する方法を教えてください。

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

Mavenプロジェクトですべての依存関係JARを出力JARにパッケージ化する方法を教えてください。

2148
soemirno
<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>
2094
IAdapter

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をロードするためのカスタムクラスローディングコードを追加する必要があります。

317
André Aronsen

私はこれを行うためのいくつかの異なる方法についてブログを書きました。

を参照してくださいApache Mavenで実行可能なjarファイル (ワードプレス)

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

ノート

それらの賛否両論は Stephan によって提供されています。


手動展開の場合

  • 長所
  • 短所
    • 依存関係は最終的な瓶の外です。

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

<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)があり、それぞれにjarlib/*が含まれています。


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があります。

177
Jin Kwon

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

<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ライフサイクルイベントにバインドします。ただし、これをpom.xmlに入れる場合はAssembly:singleゴールを呼び出す必要がありますが、コマンドラインから手動で実行する場合は '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>
131

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>
96
Vijay Katam

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

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

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

単一の結果のJAR内に他のJARコンテンツを本当に再パッケージ化したい場合のもう1つのオプションは Maven Assemblyプラグイン です。それは<unpack>true</unpack>を通してそれを解凍しそして次にディレクトリに再パックします。次に、それを1つの巨大なJARに組み込んだセカンドパスがあります。

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

15

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 を使用して出力(ターゲット)ディレクトリに切り替え、 Java -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependenciesのようなコマンドを使用してjarを起動したときに、これをチェックできます.jar .

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

13

私はすべての依存関係を含む太い実行可能なjarファイルを作成しようとしているこれらすべての応答を調べましたが、どれも正しく機能しませんでした。答えはshadeプラグインです。とても簡単で分かりやすいです。

    <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から来ました

11
dsutherland

maven-shade-pluginmaven-jar-pluginを組み合わせることができます。

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

maven-jar-pluginのPOM構成の例:

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

あなたは以下のような超大瓶を作るためにMaven-shadeプラグインを使うことができます。

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

これはMaven用の実行可能なjarプラグインです。これはCredit Karmaで使用しています。入れ子になったjarからクラスをロードできるクラスローダーを使ってjarのjarファイルを作成します。これにより、devとprodで同じクラスパスを使用しながら、すべてのクラスを単一の署名付きjarファイルに保存することができます。

https://github.com/creditkarma/maven-exec-jar-plugin

そして、ここにプラグインについての詳細と我々がそれを作った理由が記されたブログ記事があります: https://engineering.creditkarma.com/general-engineering/new-executable-jar-plugin-available-Apache-maven/ /

9
jchavannes

Ken Liuは私の意見ではそれを正しく持っています。 Mavenの依存関係プラグインを使用すると、すべての依存関係を拡張し、それらをリソースとして扱うことができます。これにより、それらを main artifactに含めることができます。 Assemblyプラグインを使用すると、修正が困難な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>
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>

パッケージ化フェーズの場合は、リソースとして生成されないため、開梱はリソース生成フェーズにする必要があります。きれいなパッケージを試してみるとわかります。

8
kac-ani

onejar plugin を使用して、すべての依存関係jarをパッケージ化した1つの実行可能jarファイルとして構築します。これで、これと似た私の問題は解決しました。 Assemblyプラグインが使用されたとき、それはすべての依存性jarをソースフォルダに解凍し、それらをjarとして再パッケージ化しました、それは私が私のコードの中に持っていた同じクラス名を持っていたすべての類似の実装onejarはここでは簡単な解決策です。

7
AmilaR

Maven-Assembly-plugin-2.2.1で共有アセンブリファイルを見つけるのに問題がありますか?

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

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

詳しくは this をご覧ください。

クラス: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>

他の人がこれまでに行ったように直接質問に答えることはしませんが、すべての依存関係をプロジェクトのjarファイルに埋め込むのは良い考えかどうか、本当に疑問に思います。

私は要点(展開/使用の容易さ)を見ますが、それはあなたの目的の使用例に依存します(そして代替手段があるかもしれません(下記参照))。

あなたがそれを完全にスタンドアロンで使うなら、なぜそうではないですか。

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

良い代替案:

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

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

Java -jar ProjectMainJar.jar com.stackoverflow.projectName.MainDynamicClassLoaderClass
5
SRG

この問題を解決するために、依存関係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>

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

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

4
Anoop Rai

あなたが望むならコマンドライン自体からであれば。プロジェクトパスから以下のコマンドを実行するだけです。

mvn Assembly:assembly

3
Mayank

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

  <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

みなさんに役立つことを待っています。

2
EliuX

私のために働いてきた何かがありました:

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

また、このプラグインを使用することができます、それはかなり良いですし、私は私のjarファイルをパッケージ化するためにそれを使用します http://sonatype.github.io/jarjar-maven-plugin/

2
Adelin

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つのfat jarを作成します。

2
Aydin K.

あなたのアプリケーションにentryPointを追加する必要がなければ、<mainClass>は必要ないと付け加えたいと思いました。 例えば、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
prayagupd

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

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

1)Eclipseのプロジェクトフォルダを右クリックしてExportを選択してください。

2)それからJava - > Runnable Jarを選択します

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

4)最後に、実行したいMainメソッドを持つクラスを選択し、Package dependencies with the Jar fileを選択してFinishをクリックします。

2
Rocky Inde

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

この記事で言及したツリープラグインを比較しました。私は2つのjarファイルとすべてのjarファイルを含むディレクトリを生成しました。私は結果を比較して、間違いなくmaven-shade-pluginが最高です。私の課題は、jax-rsとJDBCサービスの他に、マージする必要がある複数のSpringリソースがあることです。それらはすべてmaven-Assembly-pluginと比較してshadeプラグインによって適切にマージされました。その場合、あなたがそれらをあなた自身のリソースフォルダーにコピーし、そしてそれらを一度手動でマージしない限り、春は失敗するでしょう。両方のプラグインは正しい依存関係ツリーを出力します。私はテスト、提供、コンパイルなどテストのような複数のスコープを持っていて、提供されたものは両方のプラグインによってスキップされました。両方とも同じマニフェストを生成しましたが、私はそれらのトランスフォーマーを使用してライセンスをshadeプラグインと統合することができました。もちろん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
Fabio

Maven-Assembly-pluginは私にとってとてもうまくいった。私はmaven-dependency-pluginを何時間も費やしましたが、動かせませんでした。主な理由は、 documentation に記述されているとおりに含めるべきアーティファクト項目を設定セクションで明示的に定義しなければならなかったことです。あなたがそれを使いたい場合のためにそこに例があります:mvn dependency:copy、そこにはどんなartifactItemsも含まれていませんが、それは動作しません。

1
Chris

これもオプションかもしれません、あなたはあなたの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>
1
salmanbw
<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>
0
Shang Gao

このブログ記事は、maven-jarとmaven-Assemblyプラグインを組み合わせた別のアプローチを示しています。ブログ投稿のAssembly configuration xmlを使用して、依存関係を拡張するか、単にフォルダに集めてマニフェストのクラスパスエントリで参照するかを制御することもできます。

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

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

0
Jan Ziegler