我們項目,都是用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變量的類都替換掉。更好的實踐,是不要只替換幾個類,而是將整份代碼都重新編譯,重新發布。