如何在JAR中静态识别缺少的方法(二进制兼容性)
我想验证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个答案与主题无关。
japi-compliance-checker - 向后API/ABI兼容性检查器用于Java库:
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
你好!伙计们,我可以为此举一个小例子。即在哪个基础上进行比较。我如何获得屏幕上的所有调试细节? – picnic4u 2012-06-13 10:54:33
@ picnic4u - 使用'japi-compliance-checker'工具的附加'--debug'选项来产生中间的javap输出到'debug /'子目录。 – aponomarenko 2012-06-15 12:27:10
非常感谢现在即时获取1.1.2版本的所有细节 – picnic4u 2012-06-15 17:02:52
有一个名为Animal Sniffer的工具,允许您提取API的签名。然后它可以静态验证API的用户是否坚持签名,并且可以静态验证API的实现者是否已经实现了一切。我认为这会很好地解决你的问题。
可以从Codehaus的Maven仓库下载动物嗅探器的jar: http://repository.codehaus.org/org/codehaus/mojo/animal-sniffer/
@Michael - 你找到下载链接了吗?它隐藏在哪里? – 2010-01-11 13:57:06
这个工具是由Maven人写的,所以我认为他们只是使用各种Maven仓库,这在Maven中很容易。不幸的是,'蚂蚁'不那么容易。 – 2010-01-11 16:51:04
我还没有测试过,但这是目前为止的最佳答案,我会在发布后立即添加评论。 – 2010-01-14 11:25:30
你需要一个检查一个特定的类或比较罐子的一个通用的工具? 如果是1类,只需在自定义类加载器中加载类,使用反射来检查方法签名,就是这样。如果你需要它为许多JAR的/类,这将是太多的工作。
@Shlomo - 谢谢,我需要它在许多JAR中的许多类 – 2010-01-11 13:45:31
Clirr - 检查二进制和源兼容性Java库与旧版本:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
谢谢,为什么两个单独的答案的方式? – 2012-02-01 02:39:17
@EranMedan嗯,不记得理由=) – aponomarenko 2012-02-01 06:54:52
japicmp是另一种检查二进制兼容性的工具。它可以作为独立的命令行工具或maven插件使用。
不要忘记透露您与您在帖子中提到的项目或博客的关系。请添加适当的披露给[全部三](http://*.com/search?q=user%3A2833924+url%3Ajapicmp)这样的答案。另外,如果您推荐一个工具或库,那么您应该展示如何应用它。 – 2015-11-02 20:44:55
您可以对其他应该关闭的问题发表评论,并且超级用户可以为你关闭 – Yoni 2010-01-11 09:47:21
@Yoni - 已经做到了 – 2010-01-11 11:03:17
“没有运行”==“静态”(在问题标题中) – aponomarenko 2011-01-19 00:06:22