Java開発におけるフォルダ構成
こんな感じでいい気がしてきた。
http://.../svn/sample/ | |--trunk/ | |--tools/ JDK, Ant, Eclipse, Tomcat, DBなどのツール類 | |--doc/ ドキュメント類 | |--sample-project/ 各プロジェクトのビルドスクリプトを呼び出す大元のビルドスクリプト | |--build.properties |--build.xml | |--build-test.properties |--build-test.xml | |--conf/ Eclipseの設定ファイル(epfファイル)などを格納する | |--sample-common/ 共通的に用いられるユーティリティクラスなどの置き場 | |--build.properties |--build.xml |--.classpath |--.project |--.settings/ | |--lib/ ライブラリ | |--libsrc/ ライブラリのソース | |--src/ | |--main/ | |--java/ プロダクトコード |--src/ | |--main/ | |--resources/ プロダクトリソース | |--sample-common-test/ sample-commonのテストケース置き場 | | |--build-test.properties |--build-test.xml | |--src/ | |--test/ | |--java/ テストコード |--src/ | |--test/ | |--resources/ テストリソース | |--sample-db/ DBアクセスがらみのクラスの置き場 | |--sample-db-test/ sample-dbのテストケース置き場 | |--sample-web/ Webアプリソースの置き場。sample-common, sample-dbに依存している | |--src/ | |--main/ | |--java/ | |--webapp/ | |--WEB-INF/ | |--lib/ | |--libsrc/ | |--resources/ | |--sample-web-test/ sample-webのテストケース置き場
ポイントはプロダクトコードとテストコードのプロジェクトを分けたこと。
分ける理由は一緒にするとテストコードのライブラリにプロダクトコードが依存しちゃってもEclipseではコンパイルエラーにならないから。
Hudsonでコンパイルエラーになって初めて気づいたりする。だったら最初から分けたほうがよくねってこと。
Hudsonのジョブはプロダクトコードのコンパイル、パッケージング(つまりSI用)とテストの2つ用意する。SI用ジョブを上流としテスト用ジョブを下流にする。
SI用ジョブではsample-project, sample-common, sample-db, sample-webをチェックアウトしsample-project/build.xmlを実行すると各プロジェクトのbuild.xmlが実行されsample-project/SIにjarやwarができるイメージ。
クラスファイルは各プロジェクトのtarget/classesとかでいい。svn:ignoreの設定も忘れずに。AntなのにMaven流なフォルダ構成なのは気にしない。--);
テスト用ジョブではsample-project, sample-common, sample-common-test, sample-db, sample-db-test, sample-web, sample-web-testをチェックアウトし
sample-project/build.xmlを実行する。その後sample-project/build-test.xmlを実行すると各プロジェクトのbuild-test.xmlが実行されテストがはしる。
JDK, Ant, Eclipse, Tomcat, DBのインストールはSVNからブラウザでダウンロードしてやってもらう。プロパティエディタやSubclipseなどは最初から入った状態で配布する。
Eclipseを起動しepfファイルを読み込んだあとは各プロジェクトをチェックアウトする。テーブル作成もsample-dbにあるバッチやビルドスクリプトの起動でできるようにする。
問題解析する際にライブラリのソースもあったほうがいいので最初からEclipseでアタッチしておく。
開発者の人数が多い場合は各チームごとにsample-commonなどのEclipseのプロジェクトを1つ任せる。Redmineならマルチプロジェクトもいけるので各チームごとにRedmineプロジェクトをたてれば管理もしやすいのではないか。
大規模でTrac1プロジェクトだとタイムラインを追う気がしないのだ。--);
小規模ならここまでしなくてもいいかもしれないが大規模になるとこれぐらい考えないとダメな気がする。