nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

MavenでWildFlyやInfinispanをビルドする

JBoss / WildFly (全部俺) Advent Calendar 2013の3日目です。前にJBoss AS7をビルドするというのを書いたのですが、これをもう少し派生させてみましょう。

お仕事でWildFlyやInfinispanをかなりの頻度でビルドしています。このあたりのプロジェクトはそこそこの規模が大きく、Mavenのマルチプロジェクト構成となっています。Mavenで大きなプロジェクトを効率的にビルドしたりするときに知っておいたほうが良い点がいくつかあります。

まずMavenのオプション設定ですが、~/.bash_profileで以下のように設定しています。スタックサイズ(-Xss)が512kだとInfinispanのビルドでjavacがStackOverflowErrorでコケるので最近1024kに変更しました。メモリも安くなってきてスタックサイズをケチるモチベーションもなくなってきましたし、64bit LinuxでのXssのデフォルトは1024kなのでもうこの定義は消しても良いかもしれません。XmxとMaxPermSizeが十分確保されていれば基本的には問題ないと思います。

export MAVEN_OPTS="-Xmn128m -Xms512m -Xmx4g -XX:MaxPermSize=1g -Xss1024k -Xverify:none -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -XX:+UseCompressedOops"

最初のビルド

最初のビルドは大抵以下のようにして、依存関係の解決、ダウンロードとコンパイルに問題がないことをまず確認します。最初からテストを走らせてそれがコケたりすると依存のダウンロードが後回しになったりしてしまって、待ち時間が細切れになったり、ビルドのトータルの待ち時間が増加します。テストは最初は飛ばしましょう。

mvn -T4 clean install -DskipTests

Mavenのテストをスキップするオプションは二種類あります。もう片方のオプション-Dmaven.test.skipだとテストのコンパイルもあわせてスキップされますが、WildFlyのようにマルチプロジェクト間でテストの依存がある場合それが解決できなくてビルドがコケてしまったりするので、テストもコンパイルはするけどテストの実行はしない、という-DskipTestsを指定しています。

最初の-TオプションはMaven 3の並列ビルドを有効化するオプションです。スレッド数を指定します。CPUコア数に対するスレッド数を指定する1Cという形式でも指定できます。4コアなら1C指定は4と同等です。WildFlyでは4つのMavenプラグインを除き全て並列ビルド対応済みとなっており、並列ビルドでビルドの高速化ができます。並列ビルドだとテストがたまにおかしくなって失敗することがある、-DskipTestsと併用している限り問題ないよ、という情報があったので僕もその通りにしています。

テストも確認

自分でテストを全部通して確認したい場合というのはそれほどないのですが一応。テストの失敗でビルド中断しないように-Dmaven.test.failure.ignoreを指定します。コケるたびにチェックしてもう一回実行してまた待つという作業のは面倒なので通してテストしてしまって後からコケたものだけチェックしたほうがスマートです。WildFlyやInfinispanのテストはかなりリソースを消費するので、MAVEN_OPTSの調整やulimitなどのプロセス数やファイルディスクリプタ数の制限を事前に拡大しておかないとOutOfMemoryErrrorやIOExceptionなどで止まります。

mvn test -Dmaven.test.failure.ignore

一部のビルド

Infinispanはcoreモジュールまでビルドしたい、というようなことがほとんどなので、-pl (projects)にcoreを指定し、合わせて-amを指定して以下のようにビルドします。

mvn -T4 clean install -DskipTests -pl core -am

この-am (also make)オプションは-plで指定したモジュールが依存しているモジュールもビルドする、という指定です。これでcoreモジュールをビルドするための最小のビルドが実行されます。

他に-amd (also make dependents)というオプションがあります。-amはcore*が*依存しているモジュールをビルドするものですが、-amdはcore*に*依存しているモジュールをビルドするオプションです。メソッドシグニチャ変えたときや、定数などコンパイル時に埋め込まれてしまうようなものを変更したときに利用するオプションです。

あとは通しビルドしてて途中でコケた場合に再開する-rf (resume from)オプションがあります。

一部のテスト

バグ修正とかするときにテストするので比較的よく使うやつです。

mvn -pl undertow test -Dtest=UndertowSubsystemTestCase

ビルド/テストマシンを用意する

通しでビルドやテストをするのに自分の作業用ラップトップとかでやるのはあまり賢くないので、できればスペックそこそこなビルドに使えるマシンを別に用意したほうが良いです。

Maven職人の朝は早い。