Maven

こんにちは。さのです。
え?さぼった?ちょっと何言ってるかわかりません。
Struts2がまだ途中な気がしますが、今回は「Maven」についてまとめたいと思います。
 

Mavenとは

POM(ProjectObjectModel)に基づいてプロジェクトの管理、明瞭化を行うツールです。POMとはプロジェクトの構成モデルという意味で、Mavenではpom.xmlという形で記述されます。

簡単に説明するとpom.xmlにプロジェクト作成のルールを書いておけばMavenが勝手にプロジェクト構成しますよということです。これにより多くのヒューマンエラーと手間を減らすことができます。
具体的に見ていきましょう。  
  

ディレクトリ構成の自動決定

Mavenでプロジェクトを作成すると、自動でディレクトリ構成を決めてしまいます。
Mavenにプロジェクトの作成を命じます。
[mvn -B archetype:generate -DgroupId=com.example -DartifactId=sample -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart] f:id:taiki_sano:20150412152420j:plain  
上図のコマンドでcom.exampleというパッケージを持つsampleという名のプロジェクトが作成されます。 f:id:taiki_sano:20150412160950j:plain

チームでプロジェクトを作成する場合、みんなが同じ構成ルールで作成する必要があります。
構成ルールを伝えていても聞き漏らしなどで異なる構成で作り始める人がいます。
ドキュメントでルールを示しても見落としてしまう人がいます。
何度も確認してもこっちのほうが良いやと勝手に構成を変えてしまう人がいます。
全部私のことです。
そういったエラーヒューマン、もとい、ヒューマンエラーを減らすことができます。
 

ライブラリの自動ダウンロード

Mavenはpom.xmlファイルに記述されたライブラリをビルド時に自動でインターネット上のCentral RepositoryからLocal Repository(usr/.m2)へ依存ライブラリも含めてダウンロードします。
The Central Repository Search Engine

「commons.exec」をCentral Repositoryで検索して、先ほど作成したプロジェクトに追加してみましょう。
f:id:taiki_sano:20150412231318j:plain Dependency Informationの内容をpom.xmlタグ内に追加します。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>sample</artifactId>
  <packaging>jar</packaging>
  <version>1.0.0-SNAPSHOT</version>
  <name>sample</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <!-- ↓追加 -->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-exec</artifactId>
      <version>1.3</version>
    </dependency>
    <!-- ↑追加 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

次にプロジェクトのルートディレクトリで[mvn package]を実行します。
f:id:taiki_sano:20150414224239p:plain

プロジェクトにライブラリが追加されます。 f:id:taiki_sano:20150414223821p:plain ※ここでは割愛しますが、pom.xmlにrepositoryタグを追加することでその他のCentral Repositoryで対応していないライブラリも自動追加可能になります。
これで色々なサイトを巡ってライブラリをかき集める必要がなく、依存関係に悩まされることも無くなります。
バージョンアップもpom.xmlを少し書き換えるだけで済みます。
また、チームの場合、pom.xmlを共有すればライブラリの統一を簡単にできます。
 

goalとpaheseとlifecycleと

Mavenはgoalとphaseとlifecycleという考え方に基づいてタスクを実行します。
・goalはプラグインメソッドです。
・phaseは基本的には0個か1個のgoalで構成されます。
・lifecycleは複数のphaseで構成されます。
先ほどの[mvn package]を例として見てみましょう。

f:id:taiki_sano:20150414224606p:plain

packageはdefaultのlifecycleに含まれるphaseの一つで、jar:jarというgoalが設定されています。 packageを呼び出すと、default lifecycleのpackageまでの全てのフェーズが実行されます。この場合、本コードをコンパイル、テストコードコンパイル、テスト実行、jar作成を行います。
今回はpackageというphaseを指定しましたが、mvnコマンドの後にはgoalを指定することもできます。
その場合、それまでのphaseは実行されず、指定したgoalのみを実行します。

※default lifecycleは他にもvalidatorなど23のphaseで構成されていますが、初期値ではgoalが設定されていないため省略しています。

これだけの処理を一回の命令で行えるため圧倒的に手順が減ります。
特に大きなプロジェクトではビルドの回数も増えるため効果も大きくなるでしょう。

まとめ

コンピュータは間違いを犯しません。エラーはいつだってヒューマンエラーです。
すみません、ヒューマンエラーって言いたいだけです。
Mavenはエラーを減らしプロジェクトを迅速に進める手伝いをしてくれるでしょう。