问题描述
我想验证2个JAR之间的二进制兼容性。
按照
- Oracle的SigTest签名测试和API一致性工具
- 测试Java API之间的兼容性
- 一个在二进制级别工作的java API向后兼容性检查器
- API分析和更改跟踪工具
或手动使用javap反编译器:
javap OLD.class> OLD.txt
javap NEW.class> NEW.txt
diff -rNau OLD.txt NEW.txt> CHANGES.txt
I want to verify binary compatibility between 2 JARs.
Following the suggestions in this answer I used jboss tattletale but it can find only missing classes.
How can I find if there are missing methods? Is it possible at all?
E.g.
"Depends - on" class Foo depends on Bar (like many other middle class workers)
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
}
}
"Compile time" 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);
}
}
Now imagine an old Bar jar is accedently replacing the compiled time bar:
"Runtime time" 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);
}
}
Is there a way to identify the missing method without running it and getting a NoSuchMethodError
?
Disclaimer: This is a major rephrasing of my own related question, which is undeletable. I chose asking a new question because the rephrasing will render the current 2 answers as quite unrelated to the topic.
japi-compliance-checker - backward API/ABI compatibility checker for a Java library:
japi-compliance-checker -lib NAME -old OLD.jar -new NEW.jar
sigtest - Oracle's SigTest signature testing and API conformance tool
japitools - test for compatibility between Java APIs
japi-checker - a java API backward compatibility checker which works at binary level
revapi - API analysis and change tracking tool
or manually using javap decompiler:
javap OLD.class > OLD.txt javap NEW.class > NEW.txt diff -rNau OLD.txt NEW.txt > CHANGES.txt
这篇关于如何静态地在JAR中识别缺失的方法(二进制兼容性)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!