遇过的坑-用ant编译java项目,如果static变量有修改,使用了该static变量的java文件, 不会重编译

我们项目,都是用ant来编译,而且是用增量编译的方式——每次编译时,不会删除之前的class文件,只重新编译有变更的java文件。

一般情况下,是没问题的,但如果修改的是static变量,那就有问题了。
如果A类使用了B类中的static变量,在编译时,A类会直接填充B类static变量的实际值。
例如,代码
public class A
{
     private void test()
     {
          String var = B.STATIC_VAR;
     }
}
public class B
{
    public static String STATIC_VAR = "var";
}

编译后的class,实际是这样
public class A
{
     private void test()
     {
          String var = ”var";//已经是实际的值,不是变量
     }
}

因此,如果你用文本编辑器直接修改B类中的变量,重新跑一次ant脚本,只是重新编译B类的lass,A类中所使用的static变量却没有变。

就这个问题,小结几点要注意的:
1、用eclipse修改、和用文本编辑器修改,表现是不一样的。用eclipse来修改,它会将相关联的类也重新编译。平时一般用eclipse来修改代码,所以比较少感知到本文提到的问题。
2、ant执行编译命令(javac)前,要将class文件先删掉,以避免本文提到的问题
3、要修改线上环境的static变量,只替换static变量所在的class文件,是会有问题的。原则上,要将所有使用这个static变量的类都替换掉。更好的实践,是不要只替换几个类,而是将整份代码都重新编译,重新发布。





遇过的坑-用ant编译java项目,如果static变量有修改,使用了该static变量的java文件, 不会重编译

上一篇:项目中废弃的form表单普通提交


下一篇:kafka Failed to send messages after 3 tries 问题解决