プロジェクトのディレクトリ構成
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の特徴と言えるから,一概に非難はできんよなぁ。:-(