1. 概要

このクイックチュートリアルでは、Mavenプロジェクトを実行可能なJarファイルにパッケージ化することに焦点を当てます。

jar ファイルを作成するときは、通常、IDEを使用せずに簡単に実行したいと考えています。 そのために、実行可能ファイルを作成するためにこれらの各アプローチを使用する場合の構成と長所/短所について説明します。

2. 構成

実行可能ファイルjarを作成するために追加の依存関係は必要ありません。 Maven Javaプロジェクトを作成し、 main(…)メソッドを使用して少なくとも1つのクラスを作成する必要があります。

この例では、ExecutableMavenJarという名前のJavaクラスを作成しました。

また、pom.xmlに次の要素が含まれていることを確認する必要があります。

<modelVersion>4.0.0</modelVersion>
<groupId>com.baeldung</groupId>
<artifactId>core-java</artifactId>
<version>0.1.0-SNAPSHOT</version>
<packaging>jar</packaging>

ここで最も重要な側面はタイプです。実行可能jarを作成するには、jarタイプを使用して構成を再確認します。

これで、さまざまなソリューションの使用を開始できます。

2.1. 手動設定

maven-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}/libs
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

注意すべき2つの重要な側面があります。

最初に、目標 copy-dependencies を指定します。これは、これらの依存関係を指定されたoutputDirectoryにコピーするようにMavenに指示します。 この例では、プロジェクトビルドディレクトリ内に libs という名前のフォルダを作成します(通常は target フォルダです)。

次に、最初のステップでコピーされた依存関係へのリンクを使用して、実行可能でクラスパス対応のjarを作成します。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>libs/</classpathPrefix>
                <mainClass>
                    com.baeldung.executable.ExecutableMavenJar
                </mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

これの最も重要な部分は、マニフェスト構成です。 すべての依存関係(フォルダー libs / )を含むクラスパスを追加し、メインクラスに関する情報を提供します。

クラスの完全修飾名を指定する必要があることに注意してください。これは、パッケージ名が含まれることを意味します。

このアプローチの長所と短所は次のとおりです。

  • pros –透過的なプロセス。各ステップを指定できます
  • 短所–マニュアル; 依存関係は最終的なjarから外れています。つまり、実行可能 jar は、libsフォルダーにアクセスしてjarで表示できる場合にのみ実行されます。

2.2. ApacheMavenアセンブリプラグイン

Apache Mavenアセンブリプラグインを使用すると、ユーザーはプロジェクトの出力を、その依存関係、モジュール、サイトドキュメント、およびその他のファイルとともに、単一の実行可能なパッケージに集約できます。

アセンブリプラグインの主な目標はsingle目標であり、これはすべてのアセンブリを作成するために使用されます(他のすべての目標は非推奨であり、将来のリリースで削除される予定です)。

pom.xmlの構成を見てみましょう。

<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>
                        com.baeldung.executable.ExecutableMavenJar
                    </mainClass>
                </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </execution>
    </executions>
</plugin>

手動によるアプローチと同様に、メインクラスに関する情報を提供する必要があります。 違いは、Mavenアセンブリプラグインが必要なすべての依存関係をjarファイルに自動的にコピーすることです。

構成コードのdescriptorRefsの部分で、プロジェクト名に追加される名前を指定しました。

この例の出力は、core-java-jar-with-dependencies.jarという名前になります。

  • pros jar ファイル内の依存関係、1つのファイルのみ
  • cons –アーティファクトのパッケージ化の基本的な制御。たとえば、クラスの再配置はサポートされていません。

2.3. ApacheMavenShadeプラグイン

Apache Maven Shadeプラグインは、プロジェクトの実行に必要なすべての依存関係で構成されるuber-jarにアーティファクトをパッケージ化する機能を提供します。 さらに、シェーディングをサポートします—つまり 名前の変更—一部の依存関係のパッケージ。

構成を見てみましょう。

<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>com.baeldung.executable.ExecutableMavenJar</mainClass>
                </transformer>
            </transformers>
        </configuration>
        </execution>
    </executions>
</plugin>

この構成には3つの主要な部分があります。

初め、 にパッケージ化されるすべての依存関係をマークします

次に、トランスフォーマーの実装を指定する必要があります。 この例では、標準のものを使用しました。

最後に、アプリケーションのメインクラスを指定する必要があります。

出力ファイルの名前はcore-java-0.1.0-SNAPSHOT-shaded.jarになります。ここで、 core-java はプロジェクト名の後に、スナップショットバージョンとプラグイン名が続きます。

  • pros jar ファイル内の依存関係、アーティファクトのパッケージ化の高度な制御、シェーディングとクラスの再配置
  • cons –複雑な構成(特に高度な機能を使用する場合)

2.4. 1つのJarMavenプラグイン

実行可能ファイルjarを作成するもう1つのオプションは、OneJarプロジェクトです。

これにより、ファイルシステムの jars からではなく、アーカイブ内のjarからクラスとリソースをロードする方法を知っているカスタムクラスローダーが提供されます。

構成を見てみましょう。

<plugin>
    <groupId>com.jolira</groupId>
    <artifactId>onejar-maven-plugin</artifactId>
    <executions>
        <execution>
            <configuration>
                <mainClass>org.baeldung.executable.
                  ExecutableMavenJar</mainClass>
                <attachToBuild>true</attachToBuild>
                <filename>
                  ${project.build.finalName}.${project.packaging}
                </filename>
            </configuration>
            <goals>
                <goal>one-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

構成に示されているように、 attachToBuild = true を使用して、メインクラスを指定し、すべての依存関係をビルドにアタッチする必要があります。

また、出力ファイル名を指定する必要があります。 さらに、Mavenの目標はone-jarです。 One Jarは、依存関係jarsが実行時にファイルシステムに展開されないようにする商用ソリューションであることに注意してください。

  • pros –クリーンな委任モデル。クラスをOne Jarのトップレベルにすることができ、外部 jar をサポートし、ネイティブライブラリをサポートできます。
  • cons –2012年以降アクティブにサポートされていません

2.5. SpringBootMavenプラグイン

最後に、最後に検討するソリューションはSpring BootMavenプラグインです。

これにより、実行可能jarまたはwarアーカイブをパッケージ化し、アプリケーションを「インプレース」で実行できます。

これを使用するには、少なくともMavenバージョン3.2を使用する必要があります。 詳細な説明はこちらにあります。

構成を見てみましょう:

<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>
                  com.baeldung.executable.ExecutableMavenJar
                </mainClass>
            </configuration>
        </execution>
    </executions>
</plugin>

Springプラグインと他のプラグインには2つの違いがあります。実行の目標はrepackageと呼ばれ、分類子はspring-bootと呼ばれます。

このプラグインを使用するためにSpring Bootアプリケーションを用意する必要はないことに注意してください。

  • pros jar ファイル内の依存関係、 jar ファイルからの依存関係を除外して、アクセス可能なすべての場所で実行でき、アーティファクトのパッケージ化を高度に制御できます。 。、warファイルのパッケージ化も
  • cons –潜在的に不要なSpringおよびSpringBoot関連のクラスを追加します

2.6. 実行可能Tomcatを使用したWebアプリケーション

最後の部分では、aj arファイル内にパックされているスタンドアロンのWebアプリケーションについて説明します。

そのためには、実行可能なjarファイルを作成するために設計された別のプラグインを使用する必要があります。

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.0</version>
    <executions>
        <execution>
            <id>tomcat-run</id>
            <goals>
                <goal>exec-war-only</goal>
            </goals>
            <phase>package</phase>
            <configuration>
                <path>/</path>
                <enableNaming>false</enableNaming>
                <finalName>webapp.jar</finalName>
                <charset>utf-8</charset>
            </configuration>
        </execution>
    </executions>
</plugin>

ゴールexec-war-onlyとして設定され、サーバーへのパス構成タグ内で指定され、次のような追加のプロパティがあります。 finalName 文字セットなど。

aj ar をビルドするには、 man package を実行します。これにより、targetディレクトリにwebapp.jarが作成されます。

アプリケーションを実行するには、コンソールに java -jar target / webapp.jar と記述し、ブラウザーで localhost:8080/を指定してテストを試みます。

  • pros – 1つのファイルがあり、展開と実行が簡単
  • cons –Tomcat埋め込みディストリビューションをawar ファイル内にパックするため、ファイルのサイズがはるかに大きくなります

これは、Tomcat7サーバーをサポートするこのプラグインの最新バージョンであることに注意してください。 エラーを回避するために、サーブレットの依存関係でscopeprovidedに設定されていることを確認できます。設定されていない場合、実行可能ファイルruntimeで競合が発生します。 ] jar

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <scope>provided</scope>
</dependency>

3. 結論

この記事では、さまざまなMavenプラグインを使用して実行可能ファイルjarを作成する多くの方法について説明しました。

このチュートリアルの完全な実装は、実行可能jarおよび実行可能warのGitHubプロジェクトにあります。

テスト方法?プロジェクトを実行可能 jar にコンパイルするには、 mvn cleanpackageコマンドを使用してMavenを実行してください。

この記事は、いくつかの洞察を提供し、ニーズに応じて好ましいアプローチを見つけるのに役立つことを願っています。

最後に、バンドルするjarのライセンスがこの種の操作を禁止していないことを確認したいと思います。 通常はそうではありませんが、検討する価値があります。