Mavenを使用して実行可能JARを作成する方法
1. 前書き
この簡単な記事では、packaging a Maven project into an executable Jar fileに焦点を当てます。
通常、jarファイルを作成するときは、IDEを使用せずに簡単に実行したいと考えています。そのために、実行可能ファイルを作成するためにこれらの各アプローチを使用する場合の構成と長所/短所について説明します。
参考文献:
2. 設定
実行可能jarを作成するために、追加の依存関係は必要ありません。 Maven Javaプロジェクトを作成し、main(…)メソッドを持つクラスを少なくとも1つ持つ必要があります。
この例では、ExecutableMavenJar.という名前のJavaクラスを作成しました
また、pom.xmlに次の要素が含まれていることを確認する必要があります。
4.0.0
com.example
core-java
0.1.0-SNAPSHOT
jar
ここで最も重要な側面はタイプです。実行可能jarを作成するには、構成がjarタイプを使用していることを再確認してください。
これで、さまざまなソリューションの使用を開始できます。
2.1. 手動設定
maven-dependency-pluginを使用して、手動でアプローチすることから始めましょう。
まず、必要なすべての依存関係を、指定するフォルダーにコピーします。
org.apache.maven.plugins
maven-dependency-plugin
copy-dependencies
prepare-package
copy-dependencies
${project.build.directory}/libs
注目すべき2つの重要な側面があります。 まず、目標copy-dependenciesを指定します。これにより、Mavenはこれらの依存関係を指定されたoutputDirectoryにコピーします。
この例では、プロジェクトビルドディレクトリ(通常はtargetフォルダ)内にlibsという名前のフォルダを作成します。
2番目のステップでは、最初のステップでコピーされた依存関係へのリンクを使用して、実行可能ファイルとクラスパス対応のjarを作成します。
org.apache.maven.plugins
maven-jar-plugin
true
libs/
org.example.executable.ExecutableMavenJar
上記の最も重要な部分は、manifest構成です。 すべての依存関係(フォルダーlibs/)を含むクラスパスを追加し、メインクラスに関する情報を提供します。
クラスの完全修飾名を指定する必要があることに注意してください。つまり、パッケージ名が含まれます。
このアプローチの長所と短所は次のとおりです。
-
pros –各ステップを指定できる透過的なプロセス
-
cons –手動、依存関係は最後のjarから外れています。つまり、実行可能jarは、libsフォルダーにアクセスして%()で表示できる場合にのみ実行されます。 t4)s
2.2. Apache Mavenアセンブリプラグイン
Apache Mavenアセンブリプラグインを使用すると、ユーザーは、プロジェクトの出力をその依存関係、モジュール、サイトドキュメント、およびその他のファイルとともに単一の実行可能なパッケージに集約できます。
アセンブリプラグインの主な目標は、singleの目標です。これは、すべてのアセンブリの作成に使用されます(他のすべての目標は非推奨であり、将来のリリースで削除される予定です)。
pom.xmlの構成を見てみましょう。
org.apache.maven.plugins
maven-assembly-plugin
package
single
org.example.executable.ExecutableMavenJar
jar-with-dependencies
手動アプローチと同様に、メインクラスに関する情報を提供する必要があります。違いは、Mavenアセンブリプラグインが必要なすべての依存関係をjarファイルに自動的にコピーすることです。
構成コードのdescriptorRefsの部分で、プロジェクト名に追加される名前を指定しました。
この例の出力は、core-java-jar-with-dependencies.jar.という名前になります。
-
pros –jarファイル内の依存関係、1ファイルのみ
-
cons –アーティファクトのパッケージ化の基本的な制御。たとえば、クラスの再配置はサポートされていません。
2.3. Apache Maven Shadeプラグイン
Apache Maven Shadeプラグインは、プロジェクトの実行に必要なすべての依存関係で構成されるuber-jarにアーティファクトをパッケージ化する機能を提供します。 さらに、シェーディングをサポートしています。 rename-いくつかの依存関係のパッケージ。
構成を見てみましょう。
org.apache.maven.plugins
maven-shade-plugin
shade
true
org.example.executable.ExecutableMavenJar
この構成には3つの主要な部分があります。
まず、<shadedArtifactAttached>は、jarにパッケージ化されるすべての依存関係をマークします。
次に、the transformer implementationを指定する必要があります。この例では、標準のものを使用しました。
最後に、アプリケーションのメインクラスを指定する必要があります。
出力ファイルの名前はcore-java-0.1.0-SNAPSHOT-shaded.jarになります。ここで、core-javaはプロジェクト名で、その後にスナップショットバージョンとプラグイン名が続きます。
-
pros –jarファイル内の依存関係、アーティファクトのパッケージ化の高度な制御、シェーディングとクラスの再配置
-
cons –複雑な構成(特に高度な機能を使用する場合)
2.4. 1つのJarMavenプラグイン
実行可能jarを作成するもう1つのオプションは、OneJarプロジェクトです。
これにより、ファイルシステムのjarsからではなく、アーカイブ内のjarからクラスとリソースをロードする方法を知っているカスタムクラスローダーが提供されます。
構成を見てみましょう。
com.jolira
onejar-maven-plugin
org.example.executable.
ExecutableMavenJar
true
${project.build.finalName}.${project.packaging}
one-jar
構成に示されているように、attachToBuild= trueを使用して、メインクラスを指定し、すべての依存関係をビルドにアタッチする必要があります。
また、出力ファイル名を提供する必要があります。 さらに、Mavenの目標はone-jarです。 One Jarは商用ソリューションであり、実行時に依存関係jarsがファイルシステムに展開されないことに注意してください。
-
pros –クリーンな委任モデル。クラスをOne Jarのトップレベルにすることができ、外部jarsをサポートし、ネイティブライブラリをサポートできます。
-
cons – 2012年以降アクティブにサポートされていません
2.5. Spring Boot Mavenプラグイン
最後に、最後に検討するソリューションは、Spring BootMavenプラグインです。
これにより、実行可能なjarまたはwarアーカイブをパッケージ化し、アプリケーションを「インプレース」で実行できます。
それを使用するには、少なくともMavenバージョン3.2を使用する必要があります。 詳細な説明はhereで入手できます。
設定を見てみましょう:
org.springframework.boot
spring-boot-maven-plugin
repackage
spring-boot
org.example.executable.ExecutableMavenJar
Springプラグインと他のプラグインには2つの違いがあります。 まず、実行の目標はrepackageと呼ばれ、分類子はspring-bootと呼ばれます。
このプラグインを使用するためにSpringBootアプリケーションを用意する必要はないことに注意してください。
-
pros –jarファイル内の依存関係、アクセス可能なすべての場所で実行でき、アーティファクトのパッケージ化の高度な制御、jarファイルなどからの依存関係の除外、jarのパッケージ化t3)sファイルも
-
cons –潜在的に不要なSpringおよびSpringBoot関連のクラスを追加します
2.6. 実行可能なTomcatを使用したWebアプリケーション
最後の部分では、jarファイル内にパックされたスタンドアロンのWebアプリケーションを使用するというトピックについて説明します。 そのためには、実行可能なjarファイルを作成するために設計された別のプラグインを使用する必要があります。
org.apache.tomcat.maven
tomcat7-maven-plugin
2.0
tomcat-run
exec-war-only
package
/
false
webapp.jar
utf-8
goalはexec-war-onlyとして設定され、サーバーへのpathはconfigurationタグ内で指定され、finalName, charsetなどの追加のプロパティがあります。 jarを作成するには、man packageを実行します。これにより、targetディレクトリにwebapp.jarが作成されます。 走る
アプリケーションを実行するには、コンソールにjava -jar target/webapp.jarと記述し、ブラウザーでlocalhost:8080 /を指定してテストしてみてください。
-
pros – 1つのファイルがあり、展開と実行が簡単
-
cons – Tomcat埋め込みディストリビューションをwarファイル内にパックするため、ファイルのサイズがはるかに大きくなります
これはこのプラグインの最新バージョンであり、Tomcat7サーバーをサポートしていることに注意してください。 エラーを回避するには、サーブレットの依存関係でscopeがprovidedとして設定されていることを確認してください。設定されていない場合、実行可能jarのruntimeで競合が発生します。
javax.servlet
javax.servlet-api
provided
3. 結論
この記事では、さまざまなMavenプラグインを使用して実行可能jarを作成する多くの方法について説明しました。
このチュートリアルの完全な実装は、this (executable jar)およびthis (executable war)Githubプロジェクトにあります。
How to test?プロジェクトを実行可能jarにコンパイルするには、mvn clean packageコマンドを使用してMavenを実行してください。
願わくば、この記事がこのトピックに関するより多くの洞察を与えてくれて、あなたのニーズに応じてあなたが好むアプローチを見つけることを願っています。
最後に、バンドルするjarのライセンスがこの種の操作を禁止していないことを確認してください。 通常はそうではありませんが、検討する価値があります。