JAR で欠落しているメソッド (バイナリ互換性) を静的に識別する方法
-
19-09-2019 - |
質問
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
シグテスト - 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/クラスでこれが必要な場合、これは大変な作業になります。