HOT deployの対象を参考に実験してみる

id:higayasuo:20060510#1147231845
ひがさんに改めて説明していただいたので、早速試してみました。Tomcat上げたままで以下のクラス

package examples.hotdeploy.util;

public class CalcUtil {
  public int add(int augend, int addend) {
    return augend + addend;
  }
}

を作成して、AddActionのcalculateメソッドを以下のように変更します

public class AddAction {
  . . .
  public String calculate() {
    CalcUtil calcUtil = new CalcUtil();
    addDto.setResult(calcUtil.add(addDto.getArg1(), addDto.getArg2()));
    return null;
  }
  . . .

これで動いちゃいますね。Tomcat再立ち上げとかは一切無し。CalcUtilの中身をいじっても即座に反映されます。

このことで、rootPackageName以下のクラスであれば、newされるクラスに対してもHOT deployが適用されることがわかりました。



ここで、HogeUtilはstatic系だったっけということで、staticメソッドに変えてみます(privateコンストラクタを作成とか、そのへんは割愛します)。Tomcatはまだ立ち上げたままです。

public class AddAction {
  . . .
  public String calculate() {
    addDto.setResult(CalcUtil.add(addDto.getArg1(), addDto.getArg2()));
    return null;
  }
  . . .
package examples.hotdeploy.util;

public class CalcUtil {
  public static int add(int augend, int addend) {
    return augend + addend;
  }
}

この変更もTomcatを上げたままで可能でした。わざとAddActionだけ先に変更してエラー画面を出し、その後にCalcUtilを修正してもきちんと動作します。これで、staticメソッドに関してもHOT deployが適用できることがわかりました。