2010-01-11 99 views
17

我想驗證2個JAR之間的二進制兼容性。如何在JAR中靜態識別缺少的方法(二進制兼容性)

按照answer的建議,我使用了jboss tattletale,但它只能找到缺失的類。

我怎樣才能找到是否有缺失的方法?它有可能嗎?

E.g.

「依賴 - 在」美孚取決於欄(像其他許多中產階級工人)類

import org.overlyusedclassnames.Bar 

public class Foo{ 
    public void someMethod(){ 
     Bar tender = new Bar(); 
     tender.getJohnnyRedLabel(); 
     tender.getJohnnyBlueLabel(); //this method is new in the Bar class 
    } 
} 

「編譯時間」 類

package org.overlyusedclassnames; 

/** 
* @Since 1992 
* Changes: added blue and gold Johnny Walker labels 
*/ 

public class Bar { 
    public Drink getJohnnyRedLabel(){ 
     return new JohnyWalkerFactory.get(RedLabel.class); 
    } 

    public Drink getJohnnyBlackLabel(){ 
     return new JohnyWalkerFactory.get(BlackLabel.class); 
    } 

    public Drink getJohnnyGoldLabel(){ 
     return new JohnyWalkerFactory.get(GoldLabel.class); 
    } 

    public Drink getJohnnyBlueLabel(){ 
     return new JohnyWalkerFactory.get(BlueLabel.class); 
    } 

} 

現在想象一下,一個酒吧瓶正在取代編譯的時間條:

「運行時間」類

package org.overlyusedclassnames; 

/** 
* @Since 1909 
* Changes: added red and black Johnny Walker labels 
*/ 

public class Bar { 
    public Drink getJohnnyRedLabel(){ 
     return new JohnyWalkerFactory.get(RedLabel.class); 
    } 

    public Drink getJohnnyBlackLabel(){ 
     return new JohnyWalkerFactory.get(BlackLabel.class); 
    } 
} 

有沒有一種方法,以確定失蹤的法不運行它,並得到一個NoSuchMethodError


免責聲明:這是我自己related question的重大的改寫,這是不可刪除。我選擇提出一個新的問題,因爲重新安排會使當前的2個答案與主題無關。

+0

您可以對其他應該關閉的問題發表評論,並且超級用戶可以爲你關閉 – Yoni 2010-01-11 09:47:21

+0

@Yoni - 已經做到了 – 2010-01-11 11:03:17

+0

「沒有運行」==「靜態」(在問題標題中) – aponomarenko 2011-01-19 00:06:22

回答

15

japi-compliance-checker - 向後API/ABI兼容性檢查器用於Java庫:

japi-compliance-checker -lib NAME -old OLD.jar -new NEW.jar 

enter image description here

sigtest - Oracle的SigTest簽名測試和API一致性工具

japitools - 測試的Java API之間的兼容性

japi-checker - 一個Java API的向後兼容性檢查器,在二進制級別

revapi作品 - API分析和變更跟蹤工具

或手動使用javap的反編譯:

 
javap OLD.class > OLD.txt 
javap NEW.class > NEW.txt 
diff -rNau OLD.txt NEW.txt > CHANGES.txt 
+0

你好!夥計們,我可以爲此舉一個小例子。即在哪個基礎上進行比較。我如何獲得屏幕上的所有調試細節? – picnic4u 2012-06-13 10:54:33

+0

@ picnic4u - 使用'japi-compliance-checker'工具的附加'--debug'選項來產生中間的javap輸出到'debug /'子目錄。 – aponomarenko 2012-06-15 12:27:10

+0

非常感謝現在即時獲取1.1.2版本的所有細節 – picnic4u 2012-06-15 17:02:52

1

有一個名爲Animal Sniffer的工具,允許您提取API的簽名。然後它可以靜態驗證API的用戶是否堅持簽名,並且可以靜態驗證API的實現者是否已經實現了一切。我認爲這會很好地解決你的問題。

可以從Codehaus的Maven倉庫下載動物嗅探器的jar: http://repository.codehaus.org/org/codehaus/mojo/animal-sniffer/

+0

@Michael - 你找到下載鏈接了嗎?它隱藏在哪裏? – 2010-01-11 13:57:06

+1

這個工具是由Maven人寫的,所以我認爲他們只是使用各種Maven倉庫,這在Maven中很容易。不幸的是,'螞蟻'不那麼容易。 – 2010-01-11 16:51:04

+0

我還沒有測試過,但這是目前爲止的最佳答案,我會在發佈後立即添加評論。 – 2010-01-14 11:25:30

0

你需要一個檢查一個特定的類或比較罐子的一個通用的工具? 如果是1類,只需在自定義類加載器中加載類,使用反射來檢查方法簽名,就是這樣。如果你需要它爲許多JAR的/類,這將是太多的工作。

+1

@Shlomo - 謝謝,我需要它在許多JAR中的許多類 – 2010-01-11 13:45:31

3

Clirr - 檢查二進制和源兼容性Java庫與舊版本:

java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
+0

謝謝,爲什麼兩個單獨的答案的方式? – 2012-02-01 02:39:17

+0

@EranMedan嗯,不記得理由=) – aponomarenko 2012-02-01 06:54:52

3

Revapi ca n也做這項工作。很容易將它加入到maven構建中,這顯然不是你的情況,但可能會引起其他人的興趣。

它還可以使用獨立模式檢查任意組的罐子。

+0

該項目沒有任何「可下載的內容」 - 或者,我在其主要網站上找不到鏈接 – Jayan 2016-01-19 06:44:08

+0

下載部分現在位於改進的網站:http ://revapi.org/downloads.html – metlos 2016-02-25 11:20:55

3

japicmp是另一種檢查二進制兼容性的工具。它可以作爲獨立的命令行工具或maven插件使用。

+0

不要忘記透露您與您在帖子中提到的項目或博客的關係。請添加適當的披露給[全部三](http://stackoverflow.com/search?q=user%3A2833924+url%3Ajapicmp)這樣的答案。另外,如果您推薦一個工具或庫,那麼您應該展示如何應用它。 – 2015-11-02 20:44:55