2011-03-24 25 views
8

我希望能夠比較兩個版本的類/庫,以確定是否有任何可能會破壞調用它的代碼的更改。例如,考慮在版本的方法有些類Foo:在方法簽名/字段中查找不兼容性的工具

public String readWidget(Object widget, Object helper); 

和版本B的方法變爲:

public String readWidget(Object widget); //removed unnecessary helper object 

或在現場的情況下,類似的事情:

version a: public static Object sharedFoo; 
version b: static Object sharedFoo; //moved to package private for version b 

我想要一個工具,將這些變化標記爲潛在的不兼容性(但理想情況下不會相反,即增加方法的可見性)。現在我知道我可以通過反射或通過分析來自javap的輸出來做到這一點,但似乎應該有一個現有的工具(最好是非商業的)。所以我想看看是否有人可以推薦一些東西,然後再犯我自己的錯誤/不必要地重新發明車輪。

回答

2

番石榴使用JDiff來報告version changes,也許你也可以找到它有用嗎?

+0

我不確定這正是我正在尋找的,但它相當接近。我也一直在看japitools。 – 2011-03-30 17:02:43

3

我可能不會理解這個問題,但編譯器不是解決這個問題的確切工具嗎?

如果存在任何不兼容情況,則使用Foo對新版本Foo重新編譯的類將很快照亮。

+1

你的陳述是真實的,但是這些都是提供給外部資源的類,所以如果它打破了他們的編譯器就會抱怨,我不希望它們對他們感到驚訝。這個想法是不打破他們的兼容性,基本上確保有足夠的時間在破壞兼容性之前棄用這些東西。換句話說,我希望在達到編譯器錯誤之前進行預防性分析。 – 2011-03-24 14:44:00

2

這裏是你不想要的答案,但我認爲這是一個有效的答案:

  1. 寫一套單元測試調用您的API的每一個方法(你已經有這個,對吧? - ))。
  2. 當您進行API更改時,請重新編譯您的API的新版本,但不要進行單元測試。
  3. 針對「新鮮」API運行「陳舊」的單元測試集。這種陳舊的一套測試成爲金絲雀,模仿你的API的客戶將是這種情況。

第一問題,只需要重新編譯所有客戶端代碼是,這可能是不可能的。代碼可能不屬於你;它可能是客戶編寫的自定義代碼,並且不適用於您。

剛剛重新編譯客戶端代碼的問題是,有時您甚至不會收到編譯錯誤,因爲調用代碼不需要更改。我遇到過這樣的問題。我有這樣的API方法:

public void doSomething(){ 
} 

與代碼鏈接它。我想將其更改爲:

public boolean doSomething() { 
} 

所以我這樣做,並重新編譯。沒有錯誤,因爲名爲doSomething()的第一個版本的代碼靜默地重新鏈接到新版本(放棄返回值,該值在Java中有效)。但是,我不知道它確實當我重新編譯時更改外部類的字節碼。我們開始在API更新時發生錯誤,但是使用它的代碼沒有重新編譯。

因此,我應該也一直在尋找哪些外部文件的字節碼因此發生了變化,而不是尋找錯誤。在那一點上,我會說你應該使用單元測試來達到這個目的,因爲無論如何你都應該寫它們。