2010-01-11 94 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