Константа не изменится после замены класса в Tomcat - PullRequest
4 голосов
/ 11 апреля 2011

Я развернул приложение на Tomcat 6, и после его развертывания я хотел внести некоторые изменения в свой константный класс и загрузил только константный класс (файл .class) в разнесенный файл войны.

Идаже после того, как я перезагружу сервер несколько раз, сделанные мной изменения не будут отображаться.

Я изменил только некоторые строки в константах.Что бы вы предложили мне сделать, кроме как снова загрузить файл войны?

1 Ответ

8 голосов
/ 11 апреля 2011

Вам придется перекомпилировать все классы, которые ссылаются на эти String константы.

Обратите внимание, что поле static final типа примитива или типа String, которое инициализируется значением постоянной времени компиляции (так называемая постоянная переменная ) будет встроенный, когда они используются в других классах.

Другими словами, если у вас есть эти классы:

public class Constants {
  public static final int FOO = 42;
}

public class Bar {
  public void frobnicate() {
    System.out.println(Constants.FOO);
  }
}

Затем во время компиляции значение FOO будет скомпилировано в файл .class Bar, что означает, что Bar больше не ссылается на Constants во время выполнения!

Это также означает, что любое изменение FOO не будет влиять на Bar до тех пор, пока вы не перекомпилируете Bar с новым Constants.class.

Этот эффект подробно обсуждается в JLS §13.4.9 final Поля и константы .

Один из способов избежать этой проблемы в будущем - убедиться, что ваши "константы" не интерпретируются компилятором как константы. Один из способов сделать это - переместить присвоение значения из инициализатора в простое присвоение через статический блок инициализатора:

public class Constants {
  public static final int FOO;

  static {
    FOO = 42;
  }
}
...