天天看點

增量打不上去?

中午吃飯讨論到了增量打不上的問題。

這樣子的情況:

你修改了A類,編譯成Jar包,把jar包名稱、A.class、路徑發給實施地測試驗證,實施地按要求操作了,重新開機服務後,發現增量沒打上啊,拿服務端日志一看,還是原來的情況。

于是懷疑實施地沒根據這個jar包名稱和路徑替換class檔案,要實施地的把打好增量的jar包發過來,反編譯一看,是這個class檔案啊,增量打進去了啊。

為什麼?難道是正式庫和測試庫搞混了?...

然後波哥說到一種情況,你修改了A類,是B類調用A類的東西,那麼編譯之後,把B.class檔案發過去就行了。

的确有這種情況。

事實是怎樣子的呢?看一個例子(來自于秦小波老師的書)

public class Constant{	
	//定義一個常量
	public final static int MAX_AGE = 150;
};
public class TestClient{
	public static void main(String[] args){
		System.out.println("人類極限壽命是:" + Constant.MAX_AGE);
	}
};
           

分别javac編譯java執行一下,輸出的是150.

然後修改常量類,把150改成200。改完後,重新編譯常量類javac Constant.java,因為TestClient沒修改,是以直接執行java TestClient.

結果是:輸出的還是150.

增量打不上去?

為什麼?因為java對于final修飾的基本類型和String類型,編譯器會認為它是穩定态,是以在編譯的時候就直接編譯到位元組碼中了,避免在運作期間引用,以提高代碼的執行效率。

是以,這個測試的Demo說明的就是這種情況,雖然TestClient沒有修改,但是也要重新編譯一下,再執行,才會出正确的結果200.

那麼這種情況在eclipse中是不會出現的,因為在eclipse中,修改了Constant類,eclipse會自動編譯所有引用類。

再回到打增量的問題,我們是怎麼做的呢?修改了常量類中的final String XXX_SQL,修改了之後,的确是用eclipse把整個工程編譯了,可是發給實施地的卻是這一個常量類class檔案,

那麼實施地的引用這個常量類的class還是原來的class。。。問題顯而易見。

是以,這種情況的增量打不上,解決辦法:修改了的final修飾的基本類型和String類型的常量,被哪些類引用了,把那些類也編譯好了一起發過去。

回到波哥說的那種情況,那就是若是隻修改了常量,那直接發引用的類就行了,常量類不發也可以。