EclipseでのJava開発 with Maven2 and Bazaar

対象: Eclipse-3.5, Maven-2.2.x, Bazaar-2.0.x

JavaでSwingアプリの開発をやっています。
具体的には、Maven2で構成管理をし、Bazaarでソースコード管理をし、NetBeansGUIを作成し、Eclipseでプログラムを書いています。開発の上で試行錯誤の末辿りついたBazaarとMaven2Eclipseの構成を紹介します。(EclipseNetBeansの連携の話は後日また)
なお、私のBazaar使用歴は短かいです(2.0からのユーザです)。以下で紹介する構成には、誤解や誤りに基く内容が含まれている可能性がありますのでご注意ください。識者のご指導ご鞭撻を期待しつつ、エントリを上げている次第です。

この説明で使う用語

プロダクト
開発しようとしているソフトウェア商品/ソフトウェアシステム。Bazaarはプロダクト。Eclipseもプロダクト。あるEclipseプラグインもプロダクト。SIerが作るなんちゃら案件もプロダクト。プロジェクトとも呼ばれますが、Eclipseのプロジェクトと区別するためにプロダクトと呼んで区別することにします。

EclipseワークスペースをBazaarの共有リポジトリとする

基本コンセプトです。Eclipse + Maven2 + Subversion との違いはここです。

Eclipseでは複数のプロジェクトを「ワークスペース」に格納し、一度に一つのワークスペースを開いて複数のプロジェクトの開発を行います。

一方、Bazaarにはプロダクトの複数のブランチを効率的に格納する「共有リポジトリ」(shared repository)というものがあり、この上で複数のブランチの開発を行います。

共有リポジトリEclipseワークスペースとして使ってしまい、それぞれのブランチはEclipseのプロジェクトとして使ってしまう構成にします。更にワークスペース=共有リポジトリをプロダクトごとに一つ作成します。プロダクトごとにワークスペース(共有リポジトリ)を作りますので、これらが散乱しないように、ワークスペース(共有リポジトリ)格納用ディレクトリ(以下のWORKSPACES_DIR)を作成するようにしました。

事前準備

作業手順を付記しますので、参考にしてください。
Bazaar、Eclipse、bzr-eclipseプラグインMaven2のインストールなどが完了した状態から説明します。

bzrにて、foo_productという共有リポジトリにdevという空のブランチを作成

コマンドラインから、

cd WORKSPACES_DIR
bzr init-repo foo_product
cd foo_product
bzr init dev
Eclipseにて、ワークスペース切り替え

Eclipseを起動し、[ファイル]→[ワークスペースの切り替え]→[その他]で、今作成した共有リポジトリfoo_productを指定します。

Eclipseにて、foo_product内のプロジェクトからMaven2リポジトリを使えるように

コマンドラインから以下のように実行します。

mvn -Declipse.workspace=<full-path-of-[foo_product]> eclipse:add-maven-repo

実行したら、Eclipseを再起動します。

Eclipseにて、ワークスペース上に新規Javaプロジェクトdevを作成

Eclipseにて、ワークスペースfoo_product内に新規Javaプロジェクトdevを作成します。Maven2プラグインをお使いの方はそこからプロジェクトを作るなどお好みの方法で。

maven2の設定(pom.xmlの作成)

foo_product/devにpom.xmlを作成します。ここもお好みの方法でやってください。他所からコピーしてきて編集する、mvn archetype:createして作成したファイル一式をコピーしてくる、Eclipseプラグインを使うなどがお勧めです。

Eclipseプロジェクトの構成

Maven2のpom.xmlEclipseのdevプロジェクトの構成を一致させる処理をします。devプロジェクトフォルダ(=devブランチフォルダ)にて、コマンドラインから

mvn eclipse:eclipse -DdownloadSource=True

と実行します。実行したらEclipseにてプロジェクトdevをリフレッシュ(F5)し、新規→ソースフォルダから、src/main/javaや、src/test/javaなどを作成します。devプロジェクト内にMaven2用のディレクトリtargetが作成されていますか?

Bazaarのignoreの指定

余分なディレクトリ(binとか)があれば、削除しましょう。
bzr statusを実行するか、bzr-eclipseにて、[team]→[status]を実行してください。

% bzr status
unknown:
  ? .project 
  ? src 
  ? target 
  ? pom.xml 
  ? .classpath 

こんな感じになりましたか?
この中のtargetディレクトリは、maven2が出力するファイルが置かれる場所です。pom.xmlさえあればこの中身は再現できるので、targetはバージョン管理外にしましょう。他のファイルはバージョン管理対象にします。

bzr ignore target
bzr add pom.xml .classpath .project src/main/java src/test/java [other-files-if-you-added]
ワークスペースの設定

Eclipseのユーザ設定はワークスペースに保存されます。プロダクトfooのためのワークスペースに、プロダクトfoo用のための設定をしましょう。

開発フェーズ

Eclipseでの開発

いつもどおりやればOKです。
Eclipseリファクタリングを行うとファイル名や場所が変動しますが、bzr-eclipseプラグインが、自動的にbzr moveしてくれます。このあたりは、Subversionプラグインと同様です。

pom.xmlの変更

いつもどおりやればOKです。
変更したら必要に応じてmvn eclipse:eclipseをします。pom.xmlの変更もbzrにコミットします。

Windows環境での注意

WindowsEclipseにてbzr-eclipseでコミットすると、コミットコメントに日本語が使用できない不具合があったため、commitはコマンドラインから行うなどしました。

開発が一段落したら、trunkブランチ(=trunkプロジェクト)と機能ブランチを作る

devブランチの開発が一段落したら、そこまでの内容をtrunkブランチとして切り出します。
bzr-eclipseにて[team]→[branch]でプロジェクト名に「trunk」を指定するのが簡単です。コマンドラインから実行するなら、以下のように実行し、Eclipseでtrunkというプロジェクトを作成します。

bzr branch dev trunk

Eclipseからはdevプロジェクトとtrunkプロジェクトが見え、trunkの内容はdevの最終コミットと同じ内容になりました。
trunkブランチを作ったら、以降の機能追加や修正は機能ブランチで行うようにします。X機能の開発やY機能の開発のための機能ブランチ、featureXとfeatureYを作ります。実装したい機能の数だけブランチを作りましょう。trunkブランチを作ったのと同じように、devのブランチを作成します。
featureXやfeatureYの作業が終了したらdevにpushします。このあたりの構成はBazaarのドキュメント「作業スペースを構成する」を参考にしました。
devブランチではfeatureXとfeatureYの整合性などを確認し、問題が無ければtrunkにpushします。


まとめ

以上が、私が行っているEclipseMaven2とBazaarの組み合わせです。
Bazaarは不慣れなため使いこなせておらず、Subversionに比べて大きなメリットを発揮できているとは言いがたいですが……。
Bazaarが良さそうなので使うことにしたものの、Bazaarはリポジトリの構成が自由すぎて、どう使えば良いのかわからなくなってしまいました。その中で数ヶ月使用してみて、良さそうな構成を見つけられたので、エントリしてみました。