少し前に書いた記事でMavenにハメられたハマってしまった。
【過去の記事】
Mavenリポジトリのローカルキャッシュ
そもそもMaven自体がどんなものかよくわからず使っていた上、問題への対処もその場しのぎ感。
「よくわからないけどなんとなく使えてる」というのは駆け出し技術者としても最高に格好が悪いため、これをきっかけにMavenについて調べてみようと思う。
Mavenとは?
そもそもMavenとはなんなのか...
Maven は Project Object Model (POM) という考え方に基づき、プロジェクトのビルド、テスト、ドキュメンテーション、成果物の配備など、プロジェクトのライフサイクル全体を管理するものです。
プロジェクトに関する色々な情報を POM に集約し、POM の情報に基づきプロジェクト全体を管理します。
私が業務中で意識して触れていたのは、「プロジェクトの依存するライブラリの管理」程度でしたが、
本当に色々できるもののようです...
Mavenの構成
以下の図は Maven のアーキテクチャを表したものです。

(参考サイトより引用。サイトのURLは記事の最後に記載しています。)
ローカルリポジトリとリモートリポジトリ、よくわからんので噛み砕いてまとめました。
- それぞれのリポジトリにはプラグインやライブラリが置かれている。
-
Mavenは必要なプラグインやライブラリをリモートからダウンロードし、ローカルに保存する。 - ローカル環境にある全プロジェクトは、ローカルリポジトリに保存したライブラリを参照することができる。
また、Mavenを使用すると、プロジェクトのライフサイクルに含まれるコンパイルやテストなどの各作業を、コマンド一つで行うことができます。
ここからは各作業について簡単にまとめていきます。
コンパイル
mvn compile
プロジェクトをコンパイルするには上記コマンドを実行します。
src/main/java/配下ソースのコンパイルが行われます。
コンパイルにより作成されたクラスファイルは target/classes ディレクトリに出力されます。
テスト
mvn test
ユニットテストを実行するには上記コマンドを実行します
デフォルトでは、以下のパターンにマッチするファイルがテストとして実行されます。
**/Test*.java**/*Test.java**/*TestCase.java
また、以下のファイルはデフォルトで除外されます:
**/Abstract*Test.java**/Abstract*TestCase.java**/*$*
パッケージング
mvn package
JAR ファイルの作成 (パッケージング) を行うには上記コマンドを実行します。
成功すると target ディレクトリに sample-1.0-SNAPSHOT.jar が作成されていることが確認できると思います。
作成される JAR ファイルの名前は、pom.xml に記述されている artifactId と version から決定されます。
インストール
mvn install
作成した JAR ファイルをローカルリポジトリにインストールするには、上記コマンドを実行します。
作成した JAR ファイルはローカルリポジトリにインストールすることで、ローカルにある他のプロジェクトから参照することができるようになります。
公開
mvn deploy
作成した JAR ファイルをリモートリポジトリに配備するには、上記コマンドを実行します。
リモートリポジトリに配備するには、リモートリポジトリの情報をpom.xmlに記述する必要があります。
リモートリポジトリの情報は、project/distributionManagementに入れ子として repository要素を追加します。
repository の子要素には id (リポジトリの識別子), name (リポジトリの名前), url (リポジトリの場所を示す URL) などが指定可能です。
設定例:
<project ...>
...
<distributionManagement>
<repository>
<id>deploy-repository</id>
<name>deployRepository</name>
<url>file://${env.M2_HOME}/deployRepository</url>
</repository>
</distributionManagement>
...
</project>
この例では (リモートリポジトリという名前に反していますが)、リモートリポジトリの位置を、Maven のインストールされているディレクトリ以下の deployRepository として指定しています。
pom.xml とは?
ここまで、pom.xmlという単語が出てきたと思います。
Mavenを使用する上で必要なことなのでこいつについてもまとめましょう。
pom.xml はプロジェクトに関する情報を持つ重要なファイルです。
プロジェクトのビルドに関する情報や、依存するライブラリの情報、プラグインの設定などが含まれます。
project 要素以下の各要素が持つ意味は以下の通りです。
| 要素 | 意味 |
|---|---|
| modelVersion | POM のバージョン。 特に変更する必要はありません。 |
| groupId | プロジェクトを一意に識別する名前。 プロジェクトのルートパッケージ名を指定するのが一般的です。 |
| artifactId | プロジェクトの成果物の名前。 作成する JAR や WAR, EAR ファイルなどの名前に使用されます。 |
| packaging | 作成する成果物のパッケージング・タイプ。 jar (デフォルト), war, ear などがあります。 |
| version | プロジェクトのバージョン。 |
| name | プロジェクトの表示名。 ドキュメントを作成するときなどに使用されます。 |
| url | プロジェクトのサイトの URL。 ドキュメントを作成するときなどに使用されます。 |
| dependencies | プロジェクトが依存するライブラリの情報。 |
先ほど「pom.xml はプロジェクトに関する情報を持つ」と述べましたが、pom.xml の内容を見ると、ソースコードの場所やクラスファイルの出力先など、重要であろう情報が記述されていません。 これは、pom.xml にはデフォルトの設定というものがあり、ここで記述されていないものは、デフォルトの値が適用されているためです。
まとめ
Mavenについて、全く理解できていませんでしたが、備忘録としてまとめる中で理解が深まったと思います。業務ではEclipseと連携させて使用しているため、今後はその辺りの詳細についても理解を深めていけたらと思います。
参考サイト
Maven | TECHSCORE(テックスコア)
http://www.techscore.com/tech/Java/ApacheJakarta/Maven/1/#maven-1-1