我们项目,都是用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文件, 不会重编译
原文:http://blog.csdn.net/lizeyang/article/details/18218687