Mavenとは何ですか?Javaのビルドと依存関係の管理

Apache Mavenは、Java開発の基礎であり、Javaで最も使用されているビルド管理ツールです。Mavenの合理化されたXMLベースの構成モデルにより、開発者はJavaベースのプロジェクトの概要を迅速に記述または把握できるため、新しいプロジェクトの開始と共有が簡単になります。Mavenは、テスト駆動開発、長期プロジェクトメンテナンスもサポートしており、その宣言型構成と幅広いプラグインにより、CI / CDの人気のあるオプションとなっています。この記事は、Maven POMとディレクトリ構造、および最初のMavenプロジェクトを構築するためのコマンドを含むMavenの簡単な紹介です。

この記事の執筆時点での最新のMavenリリースはMaven3.6.3であることに注意してください。

Maven vs Ant and Gradle

MavenはJavaエコシステムの唯一のビルドツールではありませんが、最も人気のあるツールです。以前の世代のXMLベースの構成ツールであるAntには、Mavenの標準化された規則ベースのプラクティスと依存関係管理がありませんが、Mavenにはない柔軟性を提供します。Gradleは、(Mavenのリポジトリを使用して)Mavenエコシステム上で実行される新しいツールですが、構成にGroovyベースまたはKotlinベースのDSLを使用することをサポートしています。3つすべてがそれ自体で優れたビルドツールであり、それぞれをCI / CDプロセスに統合できます。重要なのは、ニーズに合ったものを選択し、それを適切に使用する方法を知ることです。

Mavenのしくみ

多くの優れたツールと同様に、Mavenはかつては複雑すぎたもの(構成の地獄)を取り込んで、消化可能な部分に単純化します。Mavenは次の3つのコンポーネントで構成されています。

  • POM:Mavenプロジェクトとその依存関係を説明するファイル。
  • ディレクトリ:POMでMavenプロジェクトを記述するための標準化された形式。
  • リポジトリ:サードパーティのソフトウェアが保存および検出される場所。

Maven POMMavenを使用するすべてのJavaプロジェクトには、ルートディレクトリにPOM(プロジェクトオブジェクトモデル)ファイルがあります。pom.xmlプロジェクトの依存関係を記述し、それを構築する方法を説明します。(依存関係は、プロジェクトに必要なサードパーティソフトウェアです。いくつかの一般的な例はJUnitとJDBCです。利用可能なすべてのツールと一般的な依存関係のリストについては、Maven中央リポジトリを参照してください。)

Mavenのディレクトリ:として知られているものMavenのディレクトリを実装設定より規約、コンフィギュレーション・地獄にエレガントなソリューション。開発者が新しいプロジェクトごとにレイアウトを定義してコンポーネントを手動で構成する必要があるのではなく(makefileおよびAntの場合のように)、Mavenは共通のプロジェクト構造を確立し、その動作を説明するための標準ファイル形式を提供します。要件をプラグインするだけで、Mavenは依存関係を呼び出し、プロジェクトを構成します。

一元化されたリポジトリー:最後に、Mavenは一元化されたリポジトリーを使用して、依存関係としてプロジェクトパッケージを検出および公開します。プロジェクトで依存関係を参照すると、Mavenはそれを一元化されたリポジトリで検出し、ローカルリポジトリにダウンロードして、プロジェクトにインストールします。ほとんどの場合、これらすべては開発者としてあなたには見えません。

Mavenの依存関係へのアクセス

デフォルトでは、MavenはMaven中央リポジトリから依存関係を解決します。一般的な代替手段はJCenterで、これには利用可能なパッケージの幅広いセットがあります。組織は、パブリックまたはプライベートの内部リポジトリを公開およびホストします。リポジトリにアクセスするには、Maven POMでそのURLを指定するか、Mavenに他のリポジトリを検索するように指示できます。

Mavenのインストール

MavenはJavaプロジェクトであるため、インストールする前に、開発環境にJDKをインストールする必要があります。(JDKのダウンロードとインストールの詳細については、「JDKとは?Java Development Kitの概要」を参照してください。)

Java開発環境をセットアップしたら、いくつかの手順でMavenをインストールできます。

  1. 最新のMavenリリースをダウンロードします(この記事の執筆時点ではMaven 3.6.3)。
  2. apache.maven.zipファイルを便利な場所に解凍します。
  3. そのファイルをパスに配置します。たとえば、UnixまたはLinuxシステムの場合:export PATH=$PATH:/home/maven/

これで、mvnコマンドにアクセスできるようになります。入力mvn -vして、Mavenが正常にインストールされたことを確認します。

MavenPOM

すべてのMavenプロジェクトのルートはpom.xmlファイルです。退屈であるという評判にもかかわらず、XMLは実際にはこのユースケースで非常にうまく機能します。MavenのPOMは読みやすく、プロジェクトで何が起こっているかを明らかにします。(JavaScriptを使用したことがある場合、これpom.xmlは目的がNode NPMのpackage.jsonファイルと似ています。)

リスト1は、非常に単純なMavenを示していpom.xmlます。

リスト1.単純なMavenPOM

   4.0.0 com.javaworld what-is-maven 1.0-SNAPSHOT Simple Maven Project jar   junit junit 4.12 test    

MavenPOMを理解する

一度コツをつかめば、POMは不思議ではありません。まず、公式のPOMスキーマを参照するだけのXMLプリアンブルをざっと見てみましょう。modelVersionただし、で始まるXMLに注意してください。これにより、使用するPOMのバージョン(この場合はMaven POM 4.0.0)がMavenに通知されます。

次に、あなたが持っているgroupIdartifactIdversion。これらの3つの属性を組み合わせることで、リポジトリ内のすべてのMaven管理リソースを一意に識別します。ファイルの上部にあるこれらの属性は、Mavenプロジェクトを説明しています。

ここでdependencies、プロジェクトの依存関係について説明しているPOMのセクションを見てください。この場合、これまでに1つの依存関係であるJUnitを取得しました。JUnitのもそのの観点から説明されていることに注意してくださいgroupIdartifactIdversion

独自のプロジェクトを記述している場合でも、プロジェクトの依存関係を記述している場合でも、これらの値は一貫して、Mavenリポジトリ内のプロジェクトの場所と使用可能なバージョンをMavenに通知します。

Mavenリポジトリでプロジェクトをホストする

POMは、プロジェクトの実行に必要なすべてのものを定義しますが、プロジェクトを潜在的な依存関係としても説明することに注意してください。依存関係となるプロジェクトを構築する場合(たとえば、他のプロジェクトが使用するライブラリを作成する場合)、次の4つの方法のいずれかで使用できるようにする必要があります。

  1. ローカルで利用できるようにします。
  2. プライベートに管理されているリモートリポジトリに公開します。
  3. クラウドベースのプライベートリポジトリに公開します。
  4. MavenCentralなどのパブリックリポジトリに公開します。

最初のケースでは、リモートリポジトリをまったく使用しません。代わりに、他の開発者は、mvn installコマンドを使用して、プロジェクトをローカルでMavenリポジトリにダウンロードしてインストールします。

2番目のケースでは、ホストされたMavenリポジトリーを使用し、プライベートに制御されたサーバーを使用して依存関係を公開およびダウンロードします。このためには、ApacheArchivaのようなリポジトリマネージャーが必要です。

新しい代替手段は、プライベートリモートリポジトリを使用することですが、それを管理するためにクラウドベースのサービス、たとえばCloudsmithに依存しています。これにより、リポジトリサーバーを立ち上げる作業なしで、リモートでホストされる依存関係の利点が得られます。もちろん、そのサービスは有料です。

最後に、プロジェクトのごく一部がCentral MavenリポジトリまたはJCenterに格納されます。これらは、広く使用されているパブリックパッケージを対象としています。他の人が使用するオープンソースの依存関係を作成している場合、自分の作業を世界中で利用できるようにするには、これらの一元化されたリポジトリの1つが必要になります。

  • Mavenリポジトリーでプロジェクトをホストする方法の詳細を学び、利用可能なリポジトリーのリストを入手してください。
  • Mavenリポジトリに公開されたソフトウェアの準備と管理に使用されるMavenリリースプラグインに関する公式のMavenドキュメントを参照してください。

Mavenパッケージをビルドする

pom.xmlリスト1から作成してディレクトリに配置すると、Mavenコマンドを実行できるようになります。Mavenには多数のコマンドがあり、プラグインを介してさらに多くのコマンドを使用できますが、開始するために必要なのはほんの一握りです。

最初のコマンドとして、を実行してみてくださいmvn package。ソースコードがまだない場合でも、このコマンドを実行すると、MavenにJUnit依存関係をダウンロードするように指示されます。Mavenのロギング出力をチェックして、依存関係がロードされていることを確認できます。

依存関係の範囲

例のPOMのJUnit依存関係がとしてマークされていることに気付いたかもしれませんscope testスコープは依存関係管理の重要な概念であり、基本的に、プロジェクトで各依存関係が呼び出されて使用される方法を定義および制限できます。testスコープはなく、アプリが展開用にパッケージされている場合、テストを実行している場合に依存性が利用可能であることを保証します。

もう1つの一般的なスコープはprovided、です。これは、依存関係がランタイム環境によって提供されることをフレームワークに通知します。これは、サーブレットコンテナにデプロイするときに、サーブレットJARSでよく見られます。これは、コンテナがそれらのJARSを提供するためです。Maven依存関係スコープの完全なリストについては、ApacheMavenのドキュメントを参照してください。

Mavenのディレクトリ構造

コマンドが完了したら、Mavenが/targetディレクトリを作成したことに注意してください。これは、プロジェクトの出力の標準的な場所です。ダウンロードした依存関係/targetは、コンパイルされたアプリケーションアーティファクトとともにディレクトリに存在します。

次に、Mavensrc/ディレクトリに配置するJavaファイルを追加します。/src/main/java/com/javaworld/Hello.javaリスト2の内容でファイルを作成します。

リスト2.Hello.java

 com.javaworld public class Hello { public static void main(String[] args){ System.out.println("Hello, JavaWorld"); } } 

/srcパスは、プロジェクトのソースファイルのための標準的なスポットです。ほとんどのプロジェクトはメインファイルをに配置し/src/main/、Javaファイルはの下のクラスパスに配置され/javaます。さらに、設定ファイルや画像など、コードではないアセットを含める場合は、を使用できます/src/main/resources。このパスのアセットはメインクラスパスに追加されます。テストファイルはになり/src/test/javaます。

確認するために、Mavenプロジェクト構造(Maven標準ディレクトリ構造で定義されている)のいくつかの重要な部分を次に示します。

Maven標準ディレクトリ構造の重要な部分

pom.xml プロジェクト記述子ファイル
/ src / main / java ソースファイルの場所
/ src / main / resources 非ソース資産の場所
/ src / test / java テストソースファイルの場所
/目標 ビルド出力の場所

Mavenプロジェクトの管理

このmvn packageコマンドは、プロジェクトをバンドルするようにMavenに指示します。すべてのプロジェクトファイルを1か所に収集する準備ができたら、このコマンドを発行します。このプロジェクトのPOMファイルでは、パッケージ化タイプをに設定しているjarため、このコマンドはMavenにアプリケーションファイルをJARにパッケージ化するように指示することを思い出してください。

Mavenは、JARの管理方法(ファットJARかシンJARか)を制御し、実行可能ファイルを指定するためのさまざまな追加オプションを提供しますmainclass。Mavenでのファイル管理の詳細については、Mavenのドキュメントを参照してください。

プロジェクトをバンドルした後、を発行することをお勧めしますmvn install。このコマンドは、プロジェクトをローカルのMavenリポジトリーにプッシュします。ローカルリポジトリに入ると、ローカルシステム内の他のMavenプロジェクトで利用できるようになります。これは、あなたやあなたのチームがまだ中央リポジトリに公開されていない依存関係JARを作成している開発シーンで役立ちます。

追加のMavenコマンド

ディレクトリでmvn test定義した単体テストを実行する準備ができたら入力します/src/java/test

mvn compileプロジェクトのクラスファイルをコンパイルする準備ができたら入力します。ホットデプロイセットアップを実行している場合、このコマンドはホットデプロイクラスローダーをトリガーします。(Spring Bootのmvn spring-boot:runコマンドのようなhot-deployツールは、クラスファイルの変更を監視します。コンパイルすると、ソースファイルがコンパイルされ、実行中のアプリケーションにそれらの変更が反映されます。)

新しいプロジェクトの開始:MavenとSpringのアーキタイプ

Maven原型は、事前に定義されたさまざまな設定に基づいて、新しいプロジェクトを起動するためのテンプレートです。各アーキタイプは、JavaEEやJavaWebアプリケーションプロジェクトなど、事前にパッケージ化された依存関係を提供します。また、既存のプロジェクトから新しいアーキタイプを作成し、それを使用して、事前定義されたレイアウトに基づいて新しいプロジェクトを迅速に作成することもできます。 Apache Mavenの原型の詳細については、Mavenのドキュメントを参照してください。

Mavenとうまく連携するSpringフレームワークは、新しいプロジェクトをスタブアウトするための追加の洗練された機能を提供します。例として、Spring Initializrは、新しいアプリで必要な要素を非常にすばやく定義できるツールです。Initializr自体はMavenの原型ではありませんが、事前の仕様に基づいてプロジェクトレイアウトを生成するという同じ目的を果たします。Initializr内mvn archetype:generateから、オプションを入力してスキャンし、構築しているものに適したアーキタイプを見つけることができます。

依存関係の追加