ひがやすを技術ブログ

電通国際情報サービスのプログラマ

HOT deployで嵌らないためのパッケージ構成

Slim3では、ルートパッケージ直下がagileパッケージとfirmパッケージに分かれます。agileパッケージには、agileに開発する必要のある機能要件に応じたクラスが入ります。firmパッケージには、ユーザの要件には直接関係しない非機能要件に応じたクラス(一般的にはインフラストラクチャ層のクラス)が入ります。
例えば、ルートパッケージがtutorialの場合、次のようになります。agileとかfirmの名前はもちろん自由に選べます。

  • tutorial
    • root package
  • tutorial.agile
  • tutorial.agile.action
    • agile package for action
  • tutorial.agile.xxx
  • tutorial.firm
    • firm package
  • tutorial.firm.xxx
    • firm package for xxx


agileパッケージのクラスからfirmパッケージのクラスは参照できます。機能要件を実現するために、インフラ層のクラスを利用するのは当然ですよね。
firmパッケージのクラスからagileパッケージのクラスは参照できません。非機能要件が、ユーザの要件に関係するのはおかしいからです。


HOT deployの対象をagileパッケージのみにすることで、HOT deployに関するエラーはほとんど起きなくなります。WTPでテストするときには、agileパッケージのクラスもfirmパッケージのクラスもWEB-INF/classesに吐き出されるので、firmパッケージのクラスからagileパッケージのクラスを参照するとClassCastExceptionがおきてしまいますが、HOT deployでエラーになるのは、このケースに限定できるので、直ぐに原因に気付き、修正できるでしょう。原因がわからなくて、嵌ることはなくなるはずです。
ClassCastExceptionがおきたときに、それが、agileパッケージのクラスを参照したことが原因なら、「tutorial.agileパッケージ以外のクラスからtutorial.agileパッケージのクラスは参照できません」のようなメッセージで例外をスローしようかなと思っています。


Seasar2でも、agileパッケージをSMART deploy対象にし、firmパッケージは、コンポーネント自動登録もしくはdiconに直書きすることで、Slim3と同様の効果を得ることができます。