如何静态地在JAR中识别缺失的方法(二进制兼容性)

我想validation2个JAR之间的二进制兼容性。

根据这个答案中的建议,我使用了jboss tattletale,但它只能找到缺少的类。

如何找到缺少的方法? 有可能吗?

例如

“取决于 – ” Foo 取决于Bar(像许多其他中产阶级工人一样)

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); } } 

现在假设一个旧的 Bar jar正在替换已编译的时间栏:

“运行时间”课程

 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情况下识别丢失的方法?


免责声明 :这是对我自己的相关问题的一个重要修改,这是不可取消的。 我之所以选择提出一个新问题,是因为改述将使当前的2个答案与主题完全无关。

japi-compliance-checker – Java库的后向API / ABI兼容性检查器:

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

在此处输入图像描述

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

Clirr – 检查Java库是否与旧版本具有二进制和源兼容性:

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

Revapi也可以完成这项工作。 很容易将它合并到maven构建中,这显然不是你的情况,但可能是其他人感兴趣的。

它还可以使用独立模式检查任意jar组。

japicmp是另一种检查二进制兼容性的工具。 它可以作为独立的命令行工具或maven插件使用。

有一个名为Animal Sniffer的工具,允许您提取API的签名。 然后,它可以静态validationAPI的用户是否坚持签名,并且可以静态validationAPI的实现者是否已实现所有内容。 我认为这可以很好地解决你的问题。

您可以从codehaus maven存储库下载Animal Sniffer的jar: http ://repository.codehaus.org/org/codehaus/mojo/animal-sniffer/

您是否需要检查特定类或通用工具来比较jar? 如果是1类,只需在自定义类加载器中加载类,使用reflection检查方法签名即可。 如果您需要许多JAR / Classes,这将是太多的工作。