【问题标题】:Constant won't change after class replaced in Tomcat在Tomcat中替换类后常量不会改变
【发布时间】:2011-04-11 05:52:00
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么不能再次上传 .war 文件?正如 Joachim Sauer 指出的那样,您知道需要使用常量重新编译和重新部署每个 .class 文件。顺便说一句,“常数”类似于 PI。 PI 的值不太可能在两次部署之间发生变化。这就是常量应该是的。可以改变的常数并不是真正的常数,可能应该使用另一种方法来存储。例如,如果您说 official language = "DE" 可以更改为“FR”,那么通常会将这样一个“不是真正的常量”存储在数据库中。
  • 我实际上将我的war文件上传到了生产服务器,所以我无法再次上传它。(这对我来说需要很长时间)。由于单词拼写错误,我不得不更改常量。幸运的是,我只需要上传另外 5 个类文件。

标签: java tomcat jakarta-ee constants tomcat6


【解决方案1】:

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

请注意,原始类型或 String 类型的 static final 字段在其他类中使用时将被内联。 >

换句话说,如果你有这些类:

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

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

那么编译时FOO的值会被编译到Bar.class文件中,也就是说Bar在运行时不再引用Constants

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

JLS §13.4.9 final Fields and Constants 详细讨论了这种影响。

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

public class Constants {
  public static final int FOO;

  static {
    FOO = 42;
  }
}

【讨论】:

  • 非常感谢它就像你说的那样工作。很有价值的回复和教训,我不会忘记了。
猜你喜欢
  • 2019-02-23
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多