SMART deploy 〜 推奨のパッケージ構成 〜

S2RMIの「SMART deployを使う場合」でつまずいたので今日はSMART deployについて調べてみます。
Seasar2のサイトのSMART deployに関する説明には「推奨のパッケージ構成を利用する事によって、SMART deployが使えるようになります。」って書いてあります。そして「推奨のパッケージ構成」とは以下の2点を満たす構成のこと(だと読めます)。

  1. 「ルートパッケージ」+「個別のパッケージ」の構成を持つ
  2. webパッケージ以下にサブアプリケーションを持つ

なんでそこが気になるかというと、サービスの数が2000〜3000くらいの規模になるとdaoパッケージに全てのdaoを入れたり、serviseパッケージに全てのserviceを入れたりしたくないので・・・。という訳で今日は上記の2点だけ満たせばホントにSMART deployが使えるのか検証してみます。

準備編

まずはDoltengのパッケージ構成にて動くアプリを作成。

プロジェクト作成
  • プロジェクト名:SMART-deploy
  • ルートパッケージ:hatena.smart
  • プロジェクトタイプ:Super Agile
DBの設定
  • jdbc.diconの編集 − 環境に合わせて。JDBCドライバの配置も忘れずに。
  • テスト用テーブルの作成 − 今回は「KINDSDETAIL(PK)」と「BREWINGMETHOD」をもつBEERテーブルを作成

(以下どうでもいい説明)
このテーブルはbeerの種類とその醸造方法を格納します。
BREWINGMETHODにセットするコードは上面醗酵:1、下面醗酵:2とします。
KINDSDETAILにはエール/ポーター/スタウト/ラガー/デュンケル/ピルスナー/ボックなどお好きなものを。

dao+entityの生成

DatabaseViewでBEERテーブルを右クリック⇒New Dao or Entity⇒Finish

viewの作成

beerというパッケージを作って、その中にbeer.htmlというファイルを作ります。以下のような感じで。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:te=
"http://www.seasar.org/teeda/extension" xml:lang="ja" lang="ja">
    <head>
        <meta name="generator" content=
        "HTML Tidy, see www.w3.org" />
        <meta http-equiv="Content-Type" content=
        "text/html; charset=UTF-8" />
        <title> We Love Beer!! </title>
    </head>
    <body>
        <form id="sampleForm">
            <input type="text" id="brewingMethod" /> <input type=
            "submit" value="DO" id="doSearch" /> <input type=
            "submit" value="Clear" id="doClear" /> 
            <table border="1">
                <tbody id="beerItems">
                    <tr>
                        <td>
                            <span id="kindsdetail" style=
                            "background-color:#FF9966">hoge</span> 
                        </td>
                    </tr>
                </tbody>
            </table>
        </form>
    </body>
</html>

そしてbeer.htmlを開いた状態で「Ctrl+5」。
pageとactionは分けたいので「Separate Page and Action」にはチェックを。
他はデフォルトでOK。

動作確認

プロジェクトを右クリ⇒Tomcatプロジェクト⇒コンテキスト定義を更新
beer.htmlを右クリ⇒Dolteng⇒View on Server
これでBEERテーブルに登録したものが表示されるはずです。

検証編

まずは普通にHOT deploy

BeerPage#prerender()の

this.setBeerItems(getBeerDao().selectAll());

コメントアウトしてDOボタンをクリック。
BEER一覧が消えます。

ルートパッケージ配下へ移動

(先ほどのコメントを外しておきましょう。)

  1. hatena.smart.hogeパッケージを作ってそこにBeerDaoを移動。
  2. Beerもhatena.smart.hogeパッケージへ移動。
  3. BeerActionもhatena.smart.hogeパッケージへ移動。
  4. BeerPageもhatena.smart.hogeパッケージへ移動。

4以外は問題なく動きました。予想どおりです。

ルートパッケージの外へ移動
  1. hatena.smart.hogeパッケージをhatena.hot.hogeパッケージへリネーム。
  2. hatena.smart.hogeパッケージをhatena.smartdeploy.hogeパッケージへリネーム。
  3. hatena.smart.hogeパッケージをhatena.nonsmart.hogeパッケージへリネーム。
  4. hatena.smart.hogeパッケージをhatenasmarthogeパッケージへリネーム。

1は当然ダメですが、なんと2は動きました。
3と4はダメなのでルートパッケージの最下層だけ前方一致で判定しているのかな?
ソースを見ればわかるのだろうけどどこらへんにあるのかわからないので保留。

深い階層へ移動

メインはここ。予想ではOKなはずだが・・・。
hogeパッケージに移動したものは元の場所へ戻します)

  1. hatena.smart.daoパッケージをhatena.smart.dao.ddaaooへリネーム。
  2. hatena.smart.entity.パッケージをhatena.smart.entity.eennttiittyyへリネーム。
  3. hatena.smart.daoパッケージをhatena.smart.dao.ddaaooへリネーム。
  4. hatena.smart.web.beerパッケージをhatena.smart.web.beer.bbeeeerrへリネーム。viewのbeerパッケージもbeer.bbeeeerrへリネーム。

4についてはURLも変わるので注意!
予想どおり全部動きました。

結論

-ルートパッケージ以下は全部コンテナに登録される。

  • pageクラスだけはhtmlと紐付けるためにweb以下に配置する必要があるが他は自由。

(2007.06.14追記)
2.4.14からはちゃんと規約通りのパッケージに入れないとダメになりそうです。ただし、判定方法は前方一致なのでさらに深い階層を掘ってそこに入れるぶんには大丈夫そう。