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

我想验证 2 个 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个答案与主题完全无关。


答案 1

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

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

答案 2

Clirr - 检查 Java 库的二进制和源代码与旧版本的兼容性:

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

推荐