在Tomcat中替换类后,常量不会更改

时间:2011-04-11 05:52:00

标签: java tomcat java-ee constants tomcat6

我已在Tomcat 6上部署了一个应用程序,在部署之后,我想对我的常量类进行一些更改,并且我只将常量类(.class文件)上传到爆炸的war文件中。

即使我多次重启服务器后,我所做的更改也不会显示。

我改变的只是常量中的一些字符串。除了再次上传war文件外,你还建议我做什么?

1 个答案:

答案 0 :(得分:8)

必须重新编译引用这些String常量的所有类。

请注意,使用compile time constant value(所谓的constant variable)初始化的基本类型或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的{​​{1}}文件中,这意味着Bar不再引用Bar在运行时!

这也意味着Constants的任何更改都不会对FOO 产生任何影响,直到您使用新Bar重新编译Bar

此效果在JLS §13.4.9 final Fields and Constants中详细讨论。

将来避免此问题的一种方法是确保编译器不会将“常量”解释为常量变量。一种方法是通过静态初始化程序块将值从初始化程序分配到简单赋值:

Constants.class