プロジェクトのディレクトリ構成

antとかmavenの説明をしていたときに,ふと出た疑問。

なんでソース(src)とコンパイル先(classes)を分けておくの?

あらためて問うと意外に明解に答えられない。
前者に関しては,Javaやり始めた頃−−まだビルドにmake使ってた頃は,ソースディレクトリにクラスファイル出力してたしな。
makeのcleanターゲットにこんな風に書いてたし。

clean:
    rm `find . -name "*.class" -print`

とか

clean:
    @for %%i in ( $(CLASSES) ) do DEL %%i

とか,めんどくさくてclean用のJavaプログラム作ってこんなとかやってた。

clean:
    java -cp . Clean

2001年くらいからant使い初めて,見よう見まねでやってきたからこそ,今振り返るとお寒いことやってなぁと思うが,こうゆうのをお寒いと思わない人もいるだろうなぁと。

ちなみに,ソースディレクトリとコンパイル先を分離しとくのは「管理しやすいから」というのが,さしあたっての答え。「間違ってCVSとかに余計なもん突っ込まれる危険性が減るでしょ」ってことで。
#「.cvsignoreに登録しとけ」というツッコミはスルー。:-D


もいっこ出た疑問は,

そもそも実行環境とプロジェクトの構成が異なるのはなんで?

というもの。「そんなこと気にしてくれるな」と言いたいところだが,しいて言えば「開発時にいるモノが本番時にいるとは限らない」ってのが理由になるだろう。たとえば,テストコードなんかそうね。でもこれも,ある種の経験則によるところが大きいだろうなぁ。
あとは,IDEの言うとおりにしたってのも理由になるけど,まともにWARファイル作れるIDEが出てきたのは,ここ数年だからなぁ。それ以前はみんなどうしていたのやら。


この疑問,たまに(というか良く)見かける,こうゆうプロジェクト構成から出たのである。

HogeHogeProject/
 |- ここに JSP とか
 |         HTML を配置
 |       :
 |- WEB-INF/
     |- web.xml
     |- classes/
     |   |- ここにソースを配置。
     |      → コンパイル先もここ。:-D
     |- lib/
     :   |- ここにライブラリを配置
     :
     :- src/
         :- ここにソースを置いて
            コンパイル先を classes/ にしているのもある。

思わず膝を屈しそうになるが,きっと良い指導者に恵まれなかったのだろうと思うと,ここに至るまでの苦悩も分からないでもない。でも,ちょっと妥協しすぎやしないかい?
さらに,このプロジェクトのチェックアウト先が,

$TOMCAT_HOME/
 |- webapps/
     |- HogeHogeProject/
         | ここにチェックアウトして開発しよう

ってなってると,目が回りそうになる。


とはいえ,こういった開発環境の分かりづらさもJavaの特徴と言えるから,一概に非難はできんよなぁ。:-(