Mavenってなにする人なの?

 

POMProject Object Model:

 

アーティファクト:ビルドの成果物として生成される単一のファイル

-         グループID:アーティファクトを生成した組織のID

-         アーティファクトID:組織内でアーティファクトを識別するID

-         バージョン:アーティファクトのバージョン

 

リポジトリ:定められたディレクトリ構成にしたがってアーティファクトを格納しておく場所

-         ローカルリポジトリ:Mavenを実行するマシンのファイルシステム上に存在

-         リモートリポジトリ:Webサーバ上で公開されているもの

 

リポジトリにアーティファクトを格納しておけば、他のプロジェクトのビルド時にそのアーティファクトを利用することが出来る。

 

●プロジェクトが必要とするアーティファクトを、11つ手作業でダウンロードしなくてもよい
●複数のプロジェクトで同じアーティファクトを共有しやすい
●どのPCでも同じようにビルドを実行できる

 

Ver1.xからの変更点

 

リポジトリ・レイアウトの変更:

階層構造を持つグループIDの作成が可能

アーティファクトだけでなくそれに対応するPOMファイルもリポジトリに格納されるようになった(POMファイルの再利用が容易になった、プロジェクトとアーティファクトとの依存に関する問題が解決されたなど)

 

POMファイルに関する変更:

 

ゴール:プラグインが実行する完結した処理の単位に名前をつけたもの(Antのターゲットに相当)

 

フェーズ:ゴールの上位に当たる、あらかじめ用意された抽象的なゴールの定義

 

主なフェーズ

compile

Javaコードをコンパイルする

Test

コンパイル済みのJavaコードをテスティング・フレームワーク(JUnit)でテストする

package

コンパイル/ユニット・テスト済みのJavaコードをパッケージ化し、プロジェクトのアーティファクトを生成する

install

アーティファクトをローカル・リポジトリに配置する

deploy

アーティファクトをリモート・リポジトリに配置する

 

このフェーズを実行する場合、その上の行に書かれているフェーズか必ず先に実行される。

数珠つなぎになったフェーズの流れをビルド・ライフ・サイクルという。

 

スコープ:プロジェクトやアーティファクトの依存関係の分類

スコープ名

説明

compile

コンパイル時の依存関係を表す。このスコープを設定されたアーティファクトにはすべてクラスパスが通される

provided

Servlet APIなど、コンパイル時には必要だが、実行時には不要となる依存関係を表す

runtime

コンパイル時には必要ないが、実行時には必要な依存関係を表す

Test

テスト・ケースのコンパイル/実行時の依存関係を表す。このスコープを設定されたアーティファクトにはすべてクラスパスが通される

system

tools.jarなど、JDKに含まれるライブラリへの依存関係を表す。リポジトリ上の位置ではなく、具体的なパスを指定する必要がある

 

 

インストール

 

Mavenウェブサイトから最新版をダウンロードし、展開。(インストーラなし)

環境変数PATH:アーカイブ・ファイルを展開したディレクトリの直下にあるbinディレクトリを設定する

環境変数JAVA_HOMEJDKのインストール・ディレクトリを設定する

Ø       mvn versionとして、Mavenのバージョンが表示されればインストール成功。

 

 

 

基本操作

コンソールでプロジェクトのルートディレクトリに移動し、mvnコマンドを入力する。

このルートディレクトリにはPOMファイルを配置しておく必要がある。

Ø       mvn <オプション> <ゴール名またはフェーズ名>      ゴール名は、プラグイン名:ゴール名の形での指定が可能

 

オプション

-e Error時のスタックとレースを返す

 

 

新規プロジェクトの作成

ビルド対象となるプロジェクトを新規に作成する場合、Maven Arche typeプラグインと呼ばれるプラグインを使うことで、あらかじめ用意された雛形をベースにプロジェクトを作成することができる。

Ø       mvn archetype:create DgroupId=<グループID> -DartifactId=<アーティファクトID>

 

ここではグループIDcom.example.app、アーティファクトIDexample-appを指定した。

すると、グループIDがそのままJavaパッケージ名として使われることになる。

 

 

(以下しばらく体験談)

となるはずだが、最初はこのエラーに出くわすかもしれない。

'org.apache.maven.plugins' could not be retrieved from repository: central due to an error: Error transferring file

 

 

これはどうやら、会社のネットワークがプロキシサーバの管理下にいるため、%MAVEN_HOME%\confの下にあるsettings.xmlproxyエレメントをたとえば以下のように書き換える必要があった。

(デフォルトではコメントアウトされている)

 

    <proxy>

      <active>true</active>

      <protocol>http</protocol>

      <host>tkproxy.xxx.yyy.com</host>

      <port>8080</port>

    </proxy>

 

そしてまた同じコマンドを実行してみると、、

 

今度はエラーメッセージが変わった。

 

そこで、試しにどこぞのサイトに載ってた以下のコマンドを試してみた。(EclipseMaven2.xで使うためのものとのこと。切れているように見えるかもしれないが一行のコマンド)

C:\temp>mvn archetype:create -DgroupId=guide.ide.eclipse -DartifactId=guide-ide-eclipse

 

するとこれが成功したので、もう一回当初のコマンドを試してみる。

 

すると今度は(何故かわからんが)成功。

 

一つ前のプロジェクトを作成したときに欠けていたライブラリがダウンロードされでもしたのだろうか?

いずれにしてもやっと、Maven上で新規プロジェクトが作成された。

ちなみにこれを全く別の(自宅のPC)で実行したところ何の問題もなく動いた。そのときのコンソールの出力は以下。(こういった出力が最初から出ないといけないんでしょうが)

全コンール出力

 

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.app</groupId>

  <artifactId>example-app</artifactId>

  <packaging>jar</packaging>

  <version>1.0-SNAPSHOT</version>

  <name>example-app</name>

  <url>http://maven.apache.org</url>

  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>3.8.1</version>

      <scope>test</scope>

    </dependency>

  </dependencies>

</project>

 

プロジェクトをビルドする際の設定はすべてこのPOM.xmlに記述する。(マシン固有の環境設定はのぞく)

この時点ですでにcompileフェーズの実行が可能。(example-appディレクトリに移動する必要アリ)

Ø       mvn compile

 

なお、このPOM.xmlにはコンパイルの対象となるソースコードの置き場所や、クラスファイルの出力先などの情報が書かれていない。Mavenでは何をどこに出力するといった設定が標準ディレクトリレイアウトとして規定されていて明示的にPOM.xmlファイルに指定しない限りデフォルトが適用される。このデフォルトレイアウトこそ、数々の試行錯誤の末に生み出された「ベストプラクティス」なのだ。よっぽどの理由がない限りこのデフォルトの恩恵に蒙ろう。Mavenユーザはもうプロジェクトのたびに似たようなディレクトリ階層をいちいち作る必要もなければ、ある人はsrc、またある人はsourceといった似てるけどちょっと違う、、といったつまらなく悩ましい問題から解放されるのである!!

 

また、compileフェーズと同様testフェーズもすでに実行可能である。

Ø       mvn test

 

packageフェーズを実行すればtarget/classesディレクトリ以下に生成されたクラスファイルがjarにまとめられてtargetディレクトリに配置される。

> mvn package

 

標準ディレクトリレイアウト

 

依存関係の設定

Mavenはビルド時に外部ライブラリを自動的にダウンロードしてビルドを行う。

この外部ライブラリに対する依存関係はあらかじめ設定しておく必要がある。

これをするには、追加したいアーティファクトのグループIDとアーティファクトID、バージョンをPOMファイルに追加するだけでよい。

 

 

アーキテクチャ

Maven のアーキテクチャ