19

2 つの JAR 間のバイナリ互換性を確認したい。

この回答の提案に従って、 jboss tattletaleを使用しましたが、見つからないクラスしか見つかりません。

不足しているメソッドがあるかどうかを確認するにはどうすればよいですか? それはまったく可能ですか?

例えば

"Depends - on" クラス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

japicmpは、バイナリ互換性をチェックするための別のツールです。スタンドアロンのコマンド ライン ツールまたは Maven プラグインとして利用できます。

于 2015-11-02T14:46:23.917 に答える
2

API の署名を抽出できるAnimal Snifferという名前のツールがあります。次に、API のユーザーが署名に固執していることを静的に検証し、API の実装者がすべてを実装していることを静的に検証できます。これで問題がうまく解決すると思います。

Animal Sniffer の jar は、codehaus maven リポジトリからダウンロードできます: 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 に答える