19

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

4

6 回答 6

17

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
于 2011-01-10T10:34:11.323 回答
3

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

java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
于 2011-01-10T10:23:11.347 回答
3

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

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

于 2014-11-26T22:23:43.757 回答
3

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

于 2015-11-02T14:46:23.917 回答
2

有一个名为Animal Sniffer的工具,可让您提取 API 的签名。然后它可以静态地验证 API 的用户是否坚持签名,并且它可以静态地验证 API 的实现者是否已经实现了一切。我认为这会很好地解决您的问题。

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

于 2010-01-11T13:12:44.630 回答
0

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

于 2010-01-11T13:36:37.190 回答