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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章