Java 常量元';在Tomcat中替换类后,不能更改

Java 常量元';在Tomcat中替换类后,不能更改,java,tomcat,jakarta-ee,constants,tomcat6,Java,Tomcat,Jakarta Ee,Constants,Tomcat6,我已经在Tomcat6上部署了一个应用程序,在部署之后,我想对常量类进行一些更改,并且只将常量类(.class文件)上传到了war文件中 即使我重新启动服务器几次,我所做的更改也不会显示出来 我只改变了常量中的一些字符串。除了再次上传war文件,您建议我做什么?您必须重新编译引用这些字符串的所有类 请注意,当在其他类中使用原始类型或类型为String的static final字段时,用a(所谓)初始化的字段将被内联 换句话说,如果您有这些课程: public class Constants {

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

即使我重新启动服务器几次,我所做的更改也不会显示出来


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

您必须重新编译引用这些
字符串的所有类

请注意,当在其他类中使用原始类型或类型为
String
static final
字段时,用a(所谓)初始化的字段将被内联

换句话说,如果您有这些课程:

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

public class Bar {
  public void frobnicate() {
    System.out.println(Constants.FOO);
  }
}
然后在编译时
FOO
的值编译到
Bar
.class
文件中,这意味着
Bar
在运行时不再引用
常量

这也意味着
FOO
的任何更改都不会对
Bar
产生影响,除非您使用新的
常量.class
重新编译
Bar

本文详细讨论了这种影响

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

public class Constants {
  public static final int FOO;

  static {
    FOO = 42;
  }
}

为什么不能再次上传.war文件?正如Joachim Sauer指出的,您知道需要使用常量重新编译和重新部署每个.class文件。顺便说一句,“常数”有点像,比方说,π。PI的值不太可能在两次部署之间发生变化。这就是常数应该是什么。可以改变的常数并不是真正的常数,应该使用另一个平均值来存储。例如,如果您有一个名称为“官方语言=“DE”,然后可以更改为“FR”,则通常会在数据库中存储这样一个“不是真正的常数”。我实际上已将war文件上载到生产服务器,因此无法再次上载它(这对我来说需要很长时间)。因为一个拼写错误的单词,我不得不改变常数。幸运的是,我只上传了另外5个类文件。非常感谢,正如你所说的那样。这是一个很有价值的回答和教训,我再也不会忘记这一点了。