ビルドライフサイクル

検証

プロジェクトに誤りがないかどうか、全ての必要な情報が利用可能かどうかを検証する。

mvn valiate

コンパイル

プロジェクトのソースコードをコンパイルする。

mvn compile

テスト

適切なユニットテスト用フレームワークを使用して、コンパイルされたソースコードをテストする。
ここで言う「テスト」とは、コードがパッケージあるいはデプロイされていなくても実行可能なものを指す。

mvn test

パッケージ

コンパイルされたコードを、jarなどの配布可能な形式にパッケージする。

mvn package

warを作るのもこのコマンドです。

インテグレーションテスト

パッケージ(された成果物)を、必要に応じてインテグレーションテストが実行可能な環境にデプロイ(配備)する。

mvn integration-test

確認

パッケージ(された成果物)が妥当であり、品質基準に適合することを確認するためのチェックを実行する。

mvn verify

インストール

ローカル環境で他プロジェクトの依存関係として利用できるように、パッケージ(された成果物)をローカルリポジトリにインストールする。

mvn install

配備

インテグレーションもしくはリリース環境で実行され、他の開発者やプロジェクトと共有できるように、最終パッケージをリモートリポジトリにコピーする。

mvn deploy

メモ

下位のビルドフェーズも実行する

インテグレーションテストやverifyは実行したことがなかったのですが、なんてことありません、あるビルドフェーズを実行すると、「下位に位置するすべてのビルドフェーズ」も同時に実行してくれるのです。

具体的に、次の感じです。

  • packageを実行すればvaliate、compile、test、packageを実行
  • deployを実行すれば、すべてのビルドフェーズを実行

clean

例えばpackageを行ってwarで、servlet-context.xmlなどのリソースを変更する場合に ファイルが上書きがされない というトラブルを何度も経験しました。
成果物を生成する場合は先にcleanを行うと吉です。

mvn clean package
mvn clean install
mvn clean deploy

ビルドライフサイクルについては以下記事を引用いたしました。
ありがとうございました。

Undertree’s Lab
Mavenのビルドライフサイクル
http://undertrees-lab.blogspot.jp/2011/11/maven.html

flyway

初期設定

mvn flyway:init

initしなくても、動く。
むしろinitしないほうが良いとどこかで見かけました。

マイグレーションの状態を確認する

mvn flyway:info

マイグレートの実行

mvn flyway:migrate

-Pオプションを指定してProfileを指定する。

失敗時のリペア

mvn flyway:repair

mvn flyway:migrateがコケたときにリペアする。
リペアしたからといって直前の失敗マイグレートがロールバックするわけではないことに注意!

サーブレットコンテナ

pom.xmlにプラグインを設定してmvnからサーブレットコンテナが立ち上がるようにします。

Tomcatを起動する

mvn tomcat7:run

Jettyを起動する

mvn jetty:run

ここでも、DBなど接続先の切り替えに-Pオプションを指定してProfileを指定する。

実例

開発環境でのコマンド例
開発環境はリバースプロキシを併用し、プロジェクト上からJettyを立ち上げる。

nohup mvn -P development -Djetty.port=8080 -Duser.timezone=Asia/Tokyo jetty:run > /dev/null &
  • AWSだとタイムゾーンが相違するため、起動オプションで指定
  • 複数のjettyを起動するため、ポート指定
  • nohupで処理をバックグラウンド実行
  • logbackでログ出力をしているので、jettyの起動ログは捨てる

その他

Profileの指定

pom.xmlに定義したプロファイルを指定する。

mvn -P [profile_name]

いつも、どこでも使うオプションです。

jarファイルをリポジトリにinstallする

mvn install:install-file -Dfile=path/to/lib/library.jar -DgroupId=[groupId]-DartifactId=[artifactId] -Dversion=1.0.0 -Dpackaging=jar -DgeneratePom=true

Mavenで管理されていないライブラリを使用する時のコマンドです。

ビルド時のテストをスキップする

前述のとおり、package、install、deployの実行時にはテストも実行されますが、タイトなスケジュールの場合は ついついテストの修正を後回し にしてしまいがちですね。

そんな場合にテスト結果に目をつぶりたいときの対処方法で、いうまでもなく非推奨 ですよ。

A. テストの実行のみをスキップする

mvn install -DskipTests=true

B. テストコードのコンパイル、およびテストの実行をスキップする

mvn install -Dmaven.test.skip=true

テストのスキップは以下を参照いたしました。

tm_senda の技術ノート
http://d.hatena.ne.jp/tm_senda/20120604/1338837404

Mavenリポジトリを指定する

コマンド実行時に参照するmvnローカルリポジトリを直接指定します。

-Dmaven.repo.local=/path/to/repo

Mavenの読み方は?

Mavenを、はじめは[マービン]と呼んでいましたが、全然違いますね。
マーヴィン・ゲイはMarvin Gayeですし。はずかしい。。。

同僚に教えてもらい[メイヴン]と矯正しましたが、これもちょっと違うようで、、、

正解はメイヴェンのようですね。

Maven (Apache) の読み方について http://ryoichi0102.hatenablog.com/entry/2014/07/09/083452

間違えていても気にしないで堂々とする 」のが強く生きていくポイントです。

この記事を書いた人はtomita@atuwebでした。


2016年02月03日:誤字など修正
2016年01月20日:追記と、記事の構成を変更
2015年12月17日:誤字を修正
2015年08月31日:タイトルをちょっと変更、読み方について追記