2つの.jarファイルの比較


93

2つの.jarファイルを比較するにはどうすればよいですか?どちらもコンパイル済みの.classファイルを持っています。

メソッドの変更などの違いが欲しい。

回答:


95

アンドレイ、これらのツールの違いは何ですか?それらは同じコアに由来しますか?
Nikolay Kuznetsov 2014

3
@NikolayKuznetsov、いや、これらのツールはコアが異なります。pkgdiff-クラス宣言、japi-compliance-checkerおよびclirrの視覚的な比較-変更の分析(最初の変更はperlで、2番目の変更はJavaで)。
linuxbuild 2014

TeamCityとの統合を試みましたか?clirrにはMavenプラグインがあり、JAPI-Checkerというツールもあるようです。
ニコライクズネツォフ

3
Japi-Compliance-CheckerとPkgdiffの両方がすべてを比較するわけではないことに注意してください。たとえば、メソッドの実装はすべて無視されます。メソッドシグネチャ、メソッドの削除、APIの互換性のみがレポートとして生成されます。バイナリを比較する場合は、diffやcmp、IntelliJプラグインなどのツールを使用するか、Beyond Compare!
スリラム

22

IntellijIdeaで 2つのファイルを選択してを押すCtrl + Dと、差分が表示されます。私はUltimateを使用していますが、コミュニティエディションで動作するかどうかはわかりません。


1
@ ChristianNilsson、Mac 10.14 Mojaveの2018.2で動作
xuesheng 2018年

Mavenラッパーの選択を間違えました。[ 外部ライブラリ]で、ラッパーを展開してからjarファイルを選択する必要があります。ありがとう@xuesheng
Christian Nilsson、

超簡単なソリューション。
-xandermonkey

それが私が探していたものです:)
z1lV3r

18
  1. .jarの名前を.zipに変更します。
  2. エキス
  3. 逆コンパイルクラスファイルJAD
  4. 再帰的な差分

2
力ずくですが、それはまさに私がやる方法です。(ただしjar、ファイルの名前を変更してpkunzip。を使用する代わりに、コンテンツの抽出に使用する場合があります。)
David R Tribble

2
オプションで、ステップ3をを呼び出してjavap -cバイトコードに保持するように置き換えます(特に「メソッドの変更」によってOPがメソッドのシグネチャの変更を意味する場合)。
Mark Peters、

ソースファイルを上下に移動するメソッド本体をどのように処理しますか?私はそれが投げると思うdiffのING javapjad調子が悪い出力を。
Marcus Junius Brutus


5

パラメータxvfを指定したjarコマンドを使用して、各jarを独自のディレクトリに抽出します。つまりjar xvf myjar.jar、各瓶のため。

次に、UNIXコマンドdiffを使用して2つのディレクトリを比較します。これにより、ディレクトリの違いが表示されます。diff -r dir1 dir22つの再帰を使用して、各ディレクトリ(.xml、.propertiesなど)のテキストファイルに違いを表示できます。

これは、バイナリクラスファイルが異なる場合にも表示されます。実際にクラスファイルを比較するには、他の人が指摘したように、それらを逆コンパイルする必要があります。


2

Linux / CygWinで私が時々使用する便利なスクリプトは次のとおりです。

#Extract the jar (war or ear)
cd dir1
jar xvf jar-file1
for i in `ls *.class`
do
 javap $i > ${i}.txt #list the functions/variables etc
done

cd dir2
jar xvf jar-file2
for i in `ls *.class`
do
 javap $i > ${i}.txt #list the functions/variables etc
done

diff -r dir1 dir2 #diff recursively

2

sje397で説明されているプロセスを実行するためのスクリプトは次のとおりです。

    #!/bin/sh

    # Needed if running on Windows
    FIND="/usr/bin/find"
    DIFF="diff -r"

    # Extract the jar (war or ear)
    JAR_FILE1=$1
    JAR_FILE2=$2

    JAR_DIR=${PWD}          # to assign to a variable
    TEMP_DIR=$(mktemp -d)

    echo "Extracting jars in $TEMP_DIR"

    EXT_DIR1="${TEMP_DIR}/${JAR_FILE1%.*}"
    EXT_DIR2="${TEMP_DIR}/${JAR_FILE2%.*}"

    mkdir ${EXT_DIR1}
    cd ${EXT_DIR1}
    jar xf ${JAR_DIR}/${JAR_FILE1}
    jad -d . -o -t2 -safe -space -b -ff -s java -r **/*.class
    cd ..

    mkdir ${EXT_DIR2}
    cd ${EXT_DIR2}
    jar xf ${JAR_DIR}/${JAR_FILE2}
    jad -d . -o -t2 -safe -space -b -ff -s java -r **/*.class
    cd ..

    # remove class files so the diff is clean
    ${FIND} ${TEMP_DIR} -name '*.class' | xargs rm

    # diff recursively 
    ${DIFF} ${EXT_DIR1} ${EXT_DIR2}

GIT for Windowsを使用してWindowsで実行できます。コマンドプロンプトを開くだけです。bashを実行し、そこからスクリプトを実行します。


2
最後の行を逃したようです:diff -r ${EXT_DIR1} ${EXT_DIR2}または${DIFF} ${EXT_DIR1} ${EXT_DIR2}(宣言した変数を再利用する場合)。cygwinを使用している人にとって、スクリプトは私が変更した2つの点を除いてほとんど機能しました:1)jadをダウンロードできないため、jad(エンタープライズファイアウォール... ); 2)としてjar xfdoes'tは以下のようにパスを理解して/cygwin/c/rest/of/pathいることにより、返されたpwdcygwinので、私はそれを変換しなければならなかったc:/rest/of/pathJAR_DIR=${PWD}JAR_DIR=${JAR_DIR#*/cygdrive/c}JAR_DIR="c:$JAR_DIR"
PetroCliff

あなたは正しい@dpgです。最後の行は$ {DIFF} $ {EXT_DIR1} $ {EXT_DIR2}でした
skanga

なにjad?PATHで使用できることがバイナリ持っていません
フィリップ

JadはJavaデコンパイラーです。私はそれはもはや維持されていないと思いますが、私は、それが利用可能見つけjavadecompilers.com/jad
skanga

引数(jarファイル)がサブディレクトリ(などfoo/bar/toto.jar)にある場合、-p引数をmkdirコマンドに追加する必要があります
Duduche

1

Java Decompilerを使用してjarファイルをソースコードファイルに変換し、WinMergeを使用して比較を実行します。

ソースコードの著作権者に相談して、問題がないかどうかを確認してください。


1

java decompilerを使用して すべての.classファイルを逆コンパイルし、すべてのファイルをプロジェクト構造として保存します。

次に、meld diffビューアを使用して、フォルダとして比較します。


0

これは一見無料のツールですhttp://www.extradata.com/products/jarc/


ありがとう。私はこれを試しました。.jarに多くのクラスがある場合、XMLで出力を生成し、それを読み取り可能にするために追加の処理が必要です
Kunal

1
私には、tools.jarが見つからないという不満がありました。私はJDKを使用しているので、それは問題ではありません。私はそれがjava7をサポートしていないと思います。
Roel Spilker、2013年

@Tomリンクが壊れています。この回答は削除できます。
David Dossot 16

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.