なにもかもを忘れっぽい自分のために、 Apache Maven の入門記事をまとめておこうと思う。

毎度のことだけど、正しい情報は公式サイト読もうね

Apache Maven

Apache Maven はプロジェクトマネジメントツールで、Project Object Model (POM) というモデルをコンセプトとしている。 Maven を使うことで、プロジェクトのビルドやドキュメンテーションなど様々なことを行うことができる。

インストール方法とかは 公式サイト読もうね

使い方

コマンドとオプションは下記の通り。

$ mvn [options] [<goal(s)>] [<phase(s)>]

細かいオプションは mvn -h しよう。

さて、 Maven life cycle phase に基づいた Maven project を構成しているなら、典型的には下記のコマンドでパッケージを作成できる。

$ mvn package

ビルトインのライフサイクルと各フェイズは次の順になっている。

  • clean - pre-clean, clean, post-clean
  • default - validate, initialize, generate-sources, process-sources, generate-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy
  • site - pre-site, site, post-site, site-deploy

これはなに?

Maven は Jakarta Turbine project のビルドプロセスを簡単にするために開発されました Ant の後継ツールで、Java ベースのプロジェクトを運用しやすくするために作られている。 Maven のゴールは開発者が短時間に開発状態などを理解しやすくさせることだ。つまり、下記の5点をゴールとしている。

  • ビルドプロセスを簡単にできること
  • 一定のビルドシステムを提供すること
  • 高水準のプロジェクト情報を提供すること
  • 開発のベストプラクティスやガイドラインを提供すること
  • 新しい機能へ簡単に移行できること

まあ噛み砕いて言えば、「プロジェクトにアサインされた時、最初に使えば何となくわかるツール」みたいなものだ。

これだけ見ればとりあえず動かしたり、テストしたり、ドキュメントを生成できたりできるようになる、そんなはずのツールだ。

主な使い方

さあ、Maven に慣れるために、早速使い始めてみよう。

まずは Maven プロジェクトを作ってみよう。 archetype:generate で、 一般的な Maven プロジェクトを開始できる。

このコマンドでは「アーキタイプ」を用いてプロジェクトを作成する。 アーキタイプとは、例えば “シンプルなJavaプロジェクト” や “GUIプロジェクト”, “サーバサイドアプリ” などのことだ。

早速、実行してみよう。

$ mavn archetype:generate

さて、このコマンドに特にオプションを指定しない場合、自動的にウィザードが立ち上がって、それに答えることで設定が行われていく。

そんなわけで、下記に示すように、いきなり「アーキタイプ」の選択肢が 2012個ほど 提示される。

2011: remote -> us.fatehi:schemacrawler-archetype-plugin-dbconnector (-)
2012: remote -> us.fatehi:schemacrawler-archetype-plugin-lint (-)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1095:

大抵のなにが何だかわからないが、とりあえず今回はデフォルトの 1095 を使うこととする。 ちなみに 1095 は An archetype which contains a sample Maven project. とのことで、サンプルプロジェクトらしい。

デフォルトのままで良いのでそのまま Enter キーを押すと、次にバージョンが聞かれる

Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
Choose a number: 6:

これもそのままで良いので Enter キーを押す。 すると、次に groupId が聞かれる。 groupId はプロジェクトを一意に識別する名前だ。 例えば、example.com というグループで alice というプロジェクトを行なっているなら com.example.alice を入れる。 groupId の次は artifactId だ。これはプロジェクトの成果物を表す名前で、JAR や WAR, EAR ファイルの名前に使われる。 その次は現在のバージョン入力が求められる。これはデフォルトのままで良い。 そして package 名が求められる。ここも基本的にはデフォルトのままでよい。

Define value for property 'groupId': com.example.alice
Define value for property 'artifactId': hello
Define value for property 'version' 1.0-SNAPSHOT: :
Define value for property 'package' com.example.alice: :

ここまで入力すると、最後に確認が表示される。OKなら Y を入力する。

Confirm properties configuration:
groupId: com.example.alice
artifactId: hello
version: 1.0-SNAPSHOT
package: com.example.alice
 Y: :

ここまでの入力が終わったら自動的にプロジェクトが作られる。

% tree
.
└── hello
    ├── pom.xml
    └── src
        ├── main
        │   └── java
        │       └── com
        │           └── example
        │               └── alice
        │                   └── App.java
        └── test
            └── java
                └── com
                    └── example
                        └── alice
                            └── AppTest.java

12 directories, 3 files

さて、プロジェクトディレクトリに移動して、コンパイルをしてみよう。 デフォルトで、上の方に示した goal, phase が全て定義済みとなっているが、よく使うのはこの辺りのコマンドだ。

| mvn compile | Java のコードをコンパイルして target ディレクトリに配置する | | mvn test | 単体テストを実行する | | mvn package | パッケージを生成して target ディレクトリに配置する | | mvn install | 作成されたパッケージをローカルリポジトリにインストールする。これにより、ローカル内の他のプロジェクトから参照可能になる。 | | mvn deploy | 作成されたパッケージをリモートリポジトリに配置する。これにより、登録されたリモートリポジトリへのアクセス権がある他の開発者が参照可能になる。 | | mvn clean | compile, test, package, などで生成された成果物を削除する | | mvn javadoc:javadoc | Javadoc を生成する |

早速、パッケージを作成し、実行してみよう。上にも示した通り、パッケージの作成は mvn package から行う。

$ cd hello
$ mvn package

こんな風に、作成に成功した風なメッセージが出れば OK だ。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.977 s
[INFO] Finished at: 2017-12-12T17:36:01+09:00
[INFO] Final Memory: 18M/307M
[INFO] ------------------------------------------------------------------------

作成できたパッケージは、 java コマンドから実行できる。-cp オプションで、classpath をパッケージから読み込み、 今回作成したアプリのメインクラスである com.example.alice.App を指定してやれば実行結果が見られるはずだ。

$ java -cp target/hello-1.0-SNAPSHOT.jar com.example.alice.App
Hello, World.

どうだろう。これで何となく Maven の世界観が分かったと思う。