2709

プロジェクトを単一の実行可能 JAR にパッケージ化して配布したいと考えています。

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

4

32 に答える 32

2650
<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が確実に構築されます。

<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>
      <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>
  </plugins>
</build>
于 2009-02-22T09:31:28.857 に答える
386

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

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

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

于 2010-12-01T10:46:24.403 に答える
294

executable-jar-with-maven-example (GitHub)を参照してください。

ノート

これらの長所と短所はStephanによって提供されます。


手動展開の場合

  • 長所
  • 短所
    • 依存関係は最終的な 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-プラグイン

  • 長所
  • 短所
    • 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ます。

于 2014-06-02T03:01:53.313 に答える
152

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

<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>
于 2009-02-26T04:31:05.863 に答える
101

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>
于 2010-09-22T15:20:20.127 に答える
22

長い間maven アセンブリ プラグインを使用していましたが、問題の解決策が見つかりませんでした"already added, skipping"。今、私は別のプラグインを使用しています - onejar-maven-plugin。以下の例 (mvn packageビルド 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>
于 2012-03-13T20:55:58.763 に答える
20

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>
于 2009-10-13T12:16:24.040 に答える
18

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でテストしました。

于 2011-08-13T18:23:43.320 に答える
17

結果として得られる単一のJAR内に他のJARコンテンツを本当に再パッケージ化する場合の別のオプションは、Mavenアセンブリプラグインです。を介してすべてを解凍し、ディレクトリに再パックします<unpack>true</unpack>。次に、それを1つの大規模なJARに組み込んだ2番目のパスがあります。

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

于 2009-03-11T15:12:55.553 に答える
16

すべての依存関係を含むファットな実行可能 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 からのものです

于 2015-11-23T20:28:55.190 に答える
15

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

  • maven-shade-plugin、クラスとすべての依存関係を 1 つの 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
于 2011-11-26T14:17:01.947 に答える
11

次のようになります。

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

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

于 2010-03-05T15:39:19.130 に答える
11

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

<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>
于 2009-09-09T13:37:43.527 に答える
9

maven-assembly-plugin-2.2.1 での共有アセンブリ ファイルの検索に問題がありますか?

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

どちらも必要なことを行いません。クラスパスでファイルを探してください。もちろん、共有アセンブリが maven-assembly-plugin のクラスパスに存在するパッケージを追加する必要があります (以下を参照)。Maven 2.x (Maven 3.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>
于 2011-03-13T11:40:45.050 に答える
8

この問題を解決するには、Maven アセンブリ プラグインを使用します。このプラグインは、JAR とその依存関係 JAR を一緒に単一の実行可能 JAR ファイルに作成します。以下のプラグイン構成を 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:single で MAVEN ツールを実行することを忘れないでください。

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

于 2016-09-01T10:21:52.237 に答える
6

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

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

完全にスタンドアロンで使用する場合は、そうではありません。

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

良い代替案:

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

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

java -jar ProjectMainJar.jar com.stackoverflow.projectName.MainDynamicClassLoaderClass
于 2009-12-28T16:43:35.350 に答える
4

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

mvn assembly:assembly
于 2010-09-14T04:37:43.210 に答える
4

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

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

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

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

于 2015-03-09T22:22:50.527 に答える
3

ここで最も投票数の多い回答を試してみたところ、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

于 2014-10-10T22:11:18.943 に答える
3

これもオプションになる可能性があります.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>
于 2015-11-25T10:40:27.850 に答える
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 も追加で作成されます。

于 2017-06-21T19:35:38.527 に答える
1

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

于 2013-05-24T19:42:04.053 に答える