我们项目,都是用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变量的类都替换掉。更好的实践,是不要只替换几个类,而是将整份代码都重新编译,重新发布。