为什么我的多jar应用程序似乎没有注意到jar中的更改,该jar只包含一类字段



我有一个应用程序,它有一个可执行JAR,它使用其他JAR的库。当我更新库JAR时,用户关闭他们的程序并再次打开它,然后使用新的JARS。然而,我有一个JAR,它只包含一个类,只包含字段。当这个JAR被单独替换时,来自旧JAR的字段中的值似乎在程序中使用。

在这一点上,旧的JAR已经从文件系统中消失了,所以我有点困惑这些值是从哪里来的。我目前的解决方案是更新另一个使用有问题JAR的JAR,但我不确定为什么这样做有效,所以我正在寻找任何可用的见解。

java代码中的常量可以由编译器内联。示例:
public class A {
    public static final String STR = "foo";
}
public class B {
    public static void main(final String... args) {
        System.out.println(A.STR);
    }
}

如果您将STR更改为"bar"并重新编译A,则B在运行时仍将打印"foo"。解决方案是重新编译和更新使用常量的代码。

另请参阅是否所有编译时常量都是内联的?

这些静态字段的值可能在程序关闭后保存在RAM中。如果您重命名包或包含这些字段的类,我敢打赌,当您修改值并重新启动时,它会起作用。这不是一个好的解决方案,只是稍微证实了值正在被缓存。我建议您不要有一个只有字段值的类。如果您想将这些值与代码的其余部分分开,那么如果字段可以很容易地表示为字符串,则可以使用属性文件。你也可以在其他类中使它们成为字段。

最新更新