回答:
IntellijIdeaで 2つのファイルを選択してを押すCtrl + D
と、差分が表示されます。私はUltimateを使用していますが、コミュニティエディションで動作するかどうかはわかりません。
jar
、ファイルの名前を変更してpkunzip
。を使用する代わりに、コンテンツの抽出に使用する場合があります。)
javap -c
バイトコードに保持するように置き換えます(特に「メソッドの変更」によってOPがメソッドのシグネチャの変更を意味する場合)。
diff
のING javap
やjad
調子が悪い出力を。
パラメータxvfを指定したjarコマンドを使用して、各jarを独自のディレクトリに抽出します。つまりjar xvf myjar.jar
、各瓶のため。
次に、UNIXコマンドdiff
を使用して2つのディレクトリを比較します。これにより、ディレクトリの違いが表示されます。diff -r dir1 dir2
2つの再帰を使用して、各ディレクトリ(.xml、.propertiesなど)のテキストファイルに違いを表示できます。
これは、バイナリクラスファイルが異なる場合にも表示されます。実際にクラスファイルを比較するには、他の人が指摘したように、それらを逆コンパイルする必要があります。
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
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を実行し、そこからスクリプトを実行します。
diff -r ${EXT_DIR1} ${EXT_DIR2}
または${DIFF} ${EXT_DIR1} ${EXT_DIR2}
(宣言した変数を再利用する場合)。cygwinを使用している人にとって、スクリプトは私が変更した2つの点を除いてほとんど機能しました:1)jadをダウンロードできないため、jad(エンタープライズファイアウォール... ); 2)としてjar xf
does'tは以下のようにパスを理解して/cygwin/c/rest/of/path
いることにより、返されたpwd
cygwinので、私はそれを変換しなければならなかったc:/rest/of/path
:JAR_DIR=${PWD}
、JAR_DIR=${JAR_DIR#*/cygdrive/c}
、JAR_DIR="c:$JAR_DIR"
jad
?PATHで使用できることがバイナリ持っていません
foo/bar/toto.jar
)にある場合、-p
引数をmkdirコマンドに追加する必要があります
Java Decompilerを使用してjarファイルをソースコードファイルに変換し、WinMergeを使用して比較を実行します。
ソースコードの著作権者に相談して、問題がないかどうかを確認してください。
java decompilerを使用して すべての.classファイルを逆コンパイルし、すべてのファイルをプロジェクト構造として保存します。
次に、meld diffビューアを使用して、フォルダとして比較します。
これは一見無料のツールですhttp://www.extradata.com/products/jarc/
http://www.osjava.org/jardiff/を試してください -ツールが古く、依存関係リストが大きいです。ドキュメントから、試してみる価値があるようです。