我已在Tomcat 6上部署了一个应用程序,在部署之后,我想对我的常量类进行一些更改,并且我只将常量类(.class
文件)上传到爆炸的war文件中。
即使我多次重启服务器后,我所做的更改也不会显示。
我改变的只是常量中的一些字符串。除了再次上传war文件外,你还建议我做什么?
答案 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