質問

2 つの JAR 間のバイナリ互換性を確認したいと考えています。

この記事の提案に従って、 答え 私が使用した ジェイボス・タトルテイル ただし、見つからないクラスのみが見つかります。

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

例えば。

「依存」クラス 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 つの回答がトピックにまったく無関係であると判断されるため、新しい質問をすることにしました。

役に立ちましたか?

解決

japi-コンプライアンスチェッカー - Java ライブラリの下位 API/ABI 互換性チェッカー:

japi-compliance-checker -lib NAME -old OLD.jar -new NEW.jar

enter image description here

シグテスト - 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

他のヒント

クリル - Java ライブラリのバイナリおよびソースと古いリリースとの互換性をチェックします。

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

レバピ 仕事もできる。これを Maven ビルドに組み込むのは簡単です。これは明らかにあなたのケースではありませんが、他の人にとっては興味深いかもしれません。

スタンドアロン モードを使用して、任意の jar セットをチェックすることもできます。

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

という名前のツールがあります 動物探知機 これにより、API の署名を抽出できます。次に、API のユーザーが署名を遵守していることを静的に検証し、API の実装者がすべてを実装していることを静的に検証できます。これであなたの問題はうまく解決すると思います。

Animal Sniffer の jar は codehaus maven リポジトリからダウンロードできます。http://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer/

特定のクラスをチェックするための が必要ですか、それとも jar を比較するための汎用ツールが必要ですか?1 つのクラスの場合は、カスタム クラス ローダーにクラスをロードし、リフレクションを使用してメソッドのシグネチャを確認するだけです。多くの JAR/クラスでこれが必要な場合、これは大変な作業になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top