Maven

第一印象

プロジェクトとは、 「一連のソースファイルから何らかの成果物を作るもの」 と捉えられる。 maven は、そういったプロジェクトの「ビルド作業」を 一括で行うことを支援するツールである。 「CUI の統合環境」と言ってもよいかもしれない。 主に java 語なプロジェクトで用いられる。

「ビルド作業」と言うと ant との比較になりがちだが、実際のところ、どちらでも ビルド作業自体はできる。 ant で build.xml をゴリゴリ書くのも、maven で pom.xml をゴリゴリ書くのも、 大差ない。 人によっては maven はプロジェクトのポータビリティを高める、 などという捉え方をする場合もあるようだが、 個人的には諸手を上げてマンセーとは言えない。

maven が最も活躍するシーンは、 「互いに関係のない複数のコンポーネントを利用して プロジェクトを作成する必要があるケース」 であると考える。 ant であれば その外部 jar をどこから入手するかを考える必要があり、 その外部 jar のバージョンにも気を使う必要があり、 jar をどうやって classpath に追加するかを考える必要があり、 何しろ手間がかかる。 maven では、どこかの maven リポジトリにあること(入手先)さえわかれば dependency を書くだけで勝手に取り込んでくれる。

他にもプロジェクトを maven 化するメリットはいくつかある。 例えば、一般的なディレクトリ構造が決まっているため、 開発者はどこに何があるかすぐに把握できる(はずだ)。 また、サイトの構築も基本機能として持っているので、 簡単にプロジェクトのサイトを作ることができる(はずだ)。

maven は基本的にはプラグインを呼び出すだけで、 ビルドプロセスにおいて積極的に自分が動くということをしない。 サイトの構築もプラグインで行うし、javadoc の生成もプラグインで行う。

これ自体は美しい割り切りだと言えるが、maven の弱点は正にこの構想そのものにある。 プラグインが散逸しすぎているがために、必要な機能をどのようにビルドプロセスに 組み込むのか、を知る方法も一元的には入手できない。

哀しい極東の島国在住の個人的な意見としては、 ローカライズにかける意気込みの低さには呆れ返るばかりだ。 魔法のステッキ「UTF」が全てのプロジェクトに適用できると言わんばかりの姿勢で、 運良く日本語を処理させるためには非常に細い道を踏み外さずに通る必要があり、 しかも実際のところは、その苦労を「たくさんのプラグインに対して」行うことになる。

maven の考え方や動きそのものを批判するわけではないが、 無条件で受け入れるにはまだ早いプロダクトだと言える。

なお、この感想は maven 2.0.5 を前提としている。

maven-proxy

会社の中で使うぜ、ということになったならば当然、リモートリポジトリに各端末・各環境・各ワーキングコピーがビルドのたびに繋げに行く、などということは推奨できない。ダウンロードのトラフィックが自滅行為であるのは当然のこと、リモートサーバに与えるトラフィックも無視できない。一つ一つは小さなリクエストだとしても、塵も積もればなんとやら、だ。

というわけで、「自分でキャッシュしつつ持ってないものは取りに行く」的な物体を探してみた。それを「リポジトリマネージャ」と呼ぶらしい。

最もシンプルな maven-proxy を試してみた。 以下のような手順で使うことができる。

  • 当り前だが、サーバ・クライアントに、Java が入ってること
  • クライアントには Maven 2.0.5 以降が入っていること
  • サーバ側で、maven-proxy のアーカイブをダウンロードして、展開
  • サーバ側で、properties ファイルもダウンロードして、編集
  • サーバ側で、maven-proxy を起動
  • クライアント側で、settings.xml に ミラーサーバとして maven-proxy を指定
  • あとは普通に使うだけ

property ファイルは、こんな具合である。

repo.local.store=/usr/local/apache/htdocs/maven/
port=9999
prefix=repository
snapshot.update=true
pom.update=true
promotion=false
serverName=http://localhost:9999
browsable=true
searchable=true
webdav=false
stylesheet=/maven-proxy/style.css
bgColor=#14B
bgColorHighlight=#94B
rowColor=#CCF
rowColorHighlight=#DDF
proxy.list=one
proxy.one.host=some.proxy.example.co.jp
proxy.one.port=8888
repo.list=local-repo,www-ibiblio-org,dist-codehaus-org,seasar2
repo.local-repo.url=file:////usr/local/apache/htdocs/maven/
repo.local-repo.description=Super Secret Custom Repository on a small laptop
repo.local-repo.copy=true
repo.local-repo.hardfail=true
repo.local-repo.cache.period=0
repo.www-ibiblio-org.url=http://mirrors.ibiblio.org/pub/mirrors/maven2
repo.www-ibiblio-org.description=www.ibiblio.org
repo.www-ibiblio-org.proxy=one
repo.www-ibiblio-org.hardfail=true
repo.www-ibiblio-org.cache.period=3600
repo.www-ibiblio-org.cache.failures=true
repo.dist-codehaus-org.url=http://dist.codehaus.org
repo.dist-codehaus-org.proxy=one
repo.dist-codehaus-org.hardfail=false
repo.dist-codehaus-org.cache.period=3600
repo.dist-codehaus-org.cache.failures=true
repo.seasar2.url=http://maven.seasar.org/maven2
repo.seasar2.proxy=one
repo.seasar2.hardfail=true
repo.seasar2.cache.period=3600
repo.seasar2.cache.failures=true

デフォルトで詳細なコメントが書かれているので、よく読んで設定する。

手抜きな起動スクリプトは、こんな具合である。

#!/bin/sh
java -jar \
  maven-proxy-standalone-0.2-app.jar \
  maven-proxy-standalone-0.2.properties

クライアント側の settings.xml は、こんな具合になる。

<settings>
  <mirrors>
    <mirror>
      <id>internal-repository</id>
      <name>Maven Repository Manager running on local machine</name>
      <url>http://localhost:9999/repository</url>
      <mirrorOf>*</mirrorOf>
    </mirror>
  </mirrors>
</settings>
[$Revision: 1.2 $ $Date: 2007.11.30 18:04:23 $]
[EOF]