DBFluteにて、torque.java.dirを変更した時のSql2Entityの挙動の問題点?
概要
だらだら書くので概要だけまとめるとこんな感じ。
torque.java.dirを指定すると、
Sql2Entityにて、sqlファイルを見つけてくれない。
※場合によっては見つけてくれる。
となります。
理由とか、結果だけみたければ下の方へ。
だらだらと。。。
以下のように、フォルダ構成する。
src/main/java
src/main/resources
gensrc
ちなみに
src/main/java
src/main/resources
はソースフォルダ(ビルドパス)
gensrcは通常フォルダ
大量の生成物が予想されるので、gensrcに出力する。
torque.java.dir=../gensrc
この状態だと、Sql2Entityが
src/main/resources
配下のsqlファイルを見つけてくれない。
ひとまず、以下に変更してみる。
torque.java.dir=../src/main/java
この状態だと見つけてくれるが、src/main/javaにBhvがないので失敗する。
(タスク自体は成功で終わる)
src/main/java
をビルドパスから除去しても挙動は同じ
gensrcをビルドパスに加えても挙動は同じ
となると、クラスパス問題ではない・・・
あとは階層の並列性の問題かも。
gensrc/src/
gensrc/resources
とかすると・・・
だめだ・・・
gensrc/src/main/java
gensrc/src/main/resources
とおったあーーーーーーー
といったお話。
ちなみに,
gensrc/java
gensrc/resources
だとだめ。
なんで?
種明かしをすると、
torque.java.dirの
"src/main/java"
を
"src/main/resources"
に置換しているので、
gensrc/main/javaでもよい。
ここでロジック整理
- torque.java.dirの取得
- そこからSQLを取得(実はsrcからもsqlファイルを取得している)
- フォルダパスに"src/main/java"を含んでいなかったらその一覧をreturn
- フォルダパスの"src/main/java"を"src/main/resources"に置換したフォルダからもsql取得
のようなことをしている。
問題整理
1)torque.java.dirを変更した場合、
src/main/resourcesのSQLファイルを取得に行かない。
2)さらに、torque.java.dirのパス文字列に"src/main/java"が含まれていない場合、
torque.java.dirそのものしか検索対象にならない。
こんな感じでしょうか?
仕様かバグか悩む・・
外出しSQLの配置場所は、src/main/resourcesとなっているし
とりあえずは、src/main/javaは常に取りに行く様にすればよい?
(言語依存だけど、リソースフォルダのこと)
ちなみに・・・
gen/src/main/java
とかにすると、
dbflute.dicon等も、
gen/src/main/resouces
に出力されてしまう。
diconや、外だしSQLに関しては、src/main/resources
にあった方が気持ちいい(?)ので
1) 外だしSQLの取得元の対処
/dbflute/src/main/java/org/seasar/dbflute/task/DfSql2EntityTask.java
protected List
// if (!DfLanguageDependencyInfoJava.containsSrcMainJava(sqlDirectory)) { // return sqlFileList; // } // final String srcMainResources = DfLanguageDependencyInfoJava.replaceSrcMainJavaToSrcMainResources(sqlDirectory); final String srcMainResources = "../" + DfLanguageDependencyInfoJava.PATH_MAVEN_SRC_MAIN_RESOURCES;
と対処してみた。
ちなみに、こっちのほうがよいのだろうけど・・
final String srcMainResources = DfLanguageDependencyInfoJava.replaceSrcMainJavaToSrcMainResources(getBasicProperties().getLanguageDependencyInfo().getDefaultSourceDirectory());
※やるならもう少し見栄えよく
2)dbflute.diconの作成場所
dbflute.diconに関しては、
torque.java.dirよりの相対パス(../resources)で出力される模様。
なので、以下指定
torque.java.dir = ../gensrc/main/java #from torque.java.dir torque.dbfluteDiconPackageName = ../../../src/main/resources
このあたりも
/dbflute/src/main/java/org/seasar/dbflute/task/DfOutsideSqlTestTask.java
は使うのであれば同様に修正が必要だろうなぁ・・・
なんか大事になってきたね・・・
追記(20080910)
jfluteさんのコメントにあるとおり、
outsideSqlDefinitionMap.dfprop
map:{
sqlDirectory = ../src/main/resources
}
という指定で対応可能なのを確認。
パスはバッチファイルなどのあるところからの相対パスになります。
いつもコメントありがとうございます。