N2 ToolBox(跡地)

跡地です。引っ越しました。http://d.hatena.ne.jp/nosen

Maven2というコンポーネント

2004-11-02 03:22:27 | オープンソース
随分久しぶりになってしまいました。

職場で風邪がアウトブレイクしていて、体調が最悪だったのと、
心も風邪をひいていて、やる気が燃え尽きていたのが原因です。
まだ完全に復調していません。ほんと先週は最悪でした。
1年ぶり位で熱をだして仕事に穴をあけてしまいました。

金でなんとかなるならやる気を買いたい今日このごろです。

愚痴ばっか言っててもしょうがないんで、久しぶりにMaven2について
調べたことを少々。

Maven1.0は、完全にコマンドラインベースのアプリケーションとして
作られていて、基本的には起動してgoalを実行したらVMも終了という
流れになっていました。
これはantの様なビルドツールとして使う分には問題ないのですが、
eclipseなどのIDEに埋め込んで使ったり、サーブレットコンテナと
同一VMで起動したい時にはよろしくありません。
特にクラスパスがらみで底の見えない穴にはまりこんでしまうこと
請け合いです。現に職場で僕の近くの席の人が見事にはまって
ました。

Maven2はそれ自体がコンポーネントとして他のアプリケーションに
埋め込まれることを前提に、よく考えられて設計されている様です。

第一に、ClassWorldを使用してプラグインごとにClassRealmを分けて
いるため、クラスパスの問題はずっと少なくなります。

第二に、プラグインとPOMのライフサイクルが
慎重に区別されています。
POMがMaven#executeメソッドの実行中のみ生きている
情報なのに対し、プラグインの情報というのは適切にキャッシュされ、
複数のビルドで共有されるべきものです。

Maven2ではV1のようにプロジェクトのパラメータをシステムプロパティ
で与えることをせず、すべてPOMのなかに閉じ込めています。
そしてPOMファイルはMaven#executeメソッドの引数で与えることができる
ので、異なるプロジェクトのビルドを同一VMで連続して行ったとしても、
パラメータが混じっておかしなことになることがありません。
余計なプラグインの情報を読み直すこともありません。

第3に、ビルド実行中に保持されるビルド固有のデータは、全て
Maven#executeメソッド(ビルドのエントリポイントになるメソッド
のローカル変数として初期化される
MavenSessionクラスのインスタンスの中に保持されます。
ぱっとソースを眺めた印象では、おそらく、
Maven#executeメソッドはマルチスレッドで実行しても問題
ないのではないかと思います。
複数プロジェクトのビルドを並行して行うような熱いことが
普通にできてしまいそうです。

(実際に動かして確認してないので、話半分で読んでくださいね)