- PR -

staticメソッドを含むクラスファイルの差分リリース

1
投稿者投稿内容
アメリカン
会議室デビュー日: 2005/06/30
投稿数: 2
投稿日時: 2005-06-30 15:05
WEBアプリ開発をしている者でございます。

現在運用中のシステムで、部分的に修正があったとします。
あるクラスのstaticメソッドのロジック部分のみを変更した場合、
コンパイルした当該クラスファイルのみ本番環境のものを上書き、
アプリケーションサーバ再起動、という手順で問題ないでしょうか。

そのstaticメソッドを呼び出す側のクラスとの整合がとれなくなる
可能性がある、と言っている同僚がいるのですが、アプリケーション
サーバを再起動するので、そんなことはないと思いますがいかがなもの
でしょうか。
c9katayama
常連さん
会議室デビュー日: 2003/02/04
投稿数: 38
投稿日時: 2005-06-30 15:11
全く問題ありません。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-06-30 15:26
それはおそらくstatic finalのような定数が絡んできた場合の
ことを同僚さんは言っているのではないでしょうか。

定数定義がしてあるファイル
public static final String msg001 = "hello"

があったとして、この定数を「goodbye」に変更、このファイル
のみをコンパイルして差分適用させると、呼び元では変更前の
「hello」が表示されると思います。

私の場合は、どんな軽微な修正であれ、モジュール単位(warとかjar?)
で全コンパイルして出すようにした方が安全だとは思っています。
アメリカン
会議室デビュー日: 2005/06/30
投稿数: 2
投稿日時: 2005-06-30 15:34
そうですよね。
たしかに全コンパイルして固めてリリースしたほうが安全ですね。
ご意見ありがとうございました。
No鶴瓶 NoLife
常連さん
会議室デビュー日: 2005/01/28
投稿数: 48
投稿日時: 2005-06-30 16:00
再起動するんだったら、
該当のクラスのみコンパイル⇒再起動でいいのでは?

定数であれメソッドであれ動的参照されるでしょ。

ちなみに、デプロイはjarとかwarとかでやってます?
jarとかwarとかでデプロイするのだったら、
全コンパイル⇒war(jar)作成⇒デプロイ⇒再起動
の方が普通かも。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-06-30 16:26
あるクラスにpublic static finalのintやString等の定数が定義されている場合に、
その定数を参照しているクラスをコンパイルした場合、
その定数への参照ではなく、直接値が取り込まれます。
コード:
class A{
public static final int AAA = 100;
}

class B{
  public static void hoge{
    System.out.println(AAA);
  }
}


というようなコードがあるとします。
クラスBのAAAの部分はコンパイル時点で100に置き換えられ、
クラスAのAAAの値を変更しても一切変わりません。
変更するのであれば、影響範囲すべてに再ビルドを行わなければ行けません。

Eclipseあたりなら自動で対処してくれると思いますが・・・
(これって、Sunのコンパイラだけなのかな・・?)
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-06-30 17:50
未記入様

static finalな定数の問題はAPサーバの再起動とは全く
の別問題です。

APサーバ再起動しようがしまいが、発生します。
classファイルレベルで参照値が記述されている
ためもういちどstatic finalな定数が絡んでいる
ソースを全てコンパイルしなおさなければ正しい
値に変更されません。

かつのり様提示のソースをサンプルにしてイメージ
で言うと、クラスBのバイトコードにはAAAという
変数ではなく100という「値」が直接書き込まれて
おり、クラスAのソースを修正後、コンパイル
したとしてもクラスBのバイトコードは100を保持
したままになるということです。
# 合ってるかな?
1

スキルアップ/キャリアアップ(JOB@IT)