Antworten:
JAPICC , Beispielnutzung:
japi-compliance-checker OLD.jar NEW.jar
Beispielberichte für log4j: http://abi-laboratory.pro/java/tracker/timeline/log4j/
PkgDiff , Beispielnutzung:
pkgdiff OLD.jar NEW.jar
Siehe Beispielbericht für args4j.
Clirr , Beispielverwendung:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
Wenn Sie in IntellijIdea zwei Dateien auswählen und drücken Ctrl + D
, wird der Unterschied angezeigt . Ich benutze Ultimate und weiß nicht, ob es mit der Community Edition funktioniert .
jar
, um den Inhalt zu extrahieren, anstatt die Datei pkunzip
javap -c
um den Bytecode beizubehalten (insbesondere, wenn durch "Methodenänderungen" das OP Änderungen an der Signatur einer Methode bedeutete).
diff
ing von javap
oder jad
Ausgang aus dem Gleichgewicht geraten.
Extrahieren Sie jedes Glas mit dem Befehl jar mit den Parametern xvf in ein eigenes Verzeichnis. dh jar xvf myjar.jar
für jedes Glas.
Verwenden Sie dann den UNIX-Befehl diff
, um die beiden Verzeichnisse zu vergleichen. Dies zeigt die Unterschiede in den Verzeichnissen. Sie können diff -r dir1 dir2
zwei Rekursionen verwenden und die Unterschiede in den Textdateien in jedem Verzeichnis (.xml, .properties usw.) anzeigen.
Dies zeigt auch, ob sich Binärklassendateien unterscheiden. Um die Klassendateien tatsächlich zu vergleichen, müssen Sie sie wie von anderen angegeben dekompilieren.
In Linux / CygWin ist ein praktisches Skript, das ich manchmal verwende:
#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
Hier ist mein Skript, um den von sje397 beschriebenen Prozess auszuführen:
#!/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}
Ich kann es unter Windows mit GIT für Windows ausführen. Öffnen Sie einfach eine Eingabeaufforderung. Führen Sie bash aus und führen Sie das Skript von dort aus aus.
diff -r ${EXT_DIR1} ${EXT_DIR2}
oder ${DIFF} ${EXT_DIR1} ${EXT_DIR2}
(wenn Sie Ihre deklarierte Variable wiederverwenden). Für diejenigen, die auf Cygwin sind, hat das Skript fast für mich funktioniert, außer zwei Dingen, die ich geändert habe: 1) Ich musste eingebautes Javap anstelle von Jad verwenden, da ich Jad nicht herunterladen kann (enterp. Firewall ... ); 2) als jar xf
does't Pfade verstehen wie /cygwin/c/rest/of/path
dem zurück von pwd
in Cygwin, musste ich es konvertieren c:/rest/of/path
: JAR_DIR=${PWD}
, JAR_DIR=${JAR_DIR#*/cygdrive/c}
,JAR_DIR="c:$JAR_DIR"
jad
? Haben Sie diese Binärdatei nicht in PATH
foo/bar/toto.jar
) befinden, müssen Sie das -p
Argument zum Befehl mkdir hinzufügen
Verwenden Sie Java Decompiler , um die JAR-Datei in eine Quellcodedatei umzuwandeln, und verwenden Sie dann WinMerge , um einen Vergleich durchzuführen.
Sie sollten den Inhaber des Urheberrechts des Quellcodes konsultieren, um festzustellen, ob dies in Ordnung ist.
Hier ist ein anscheinend kostenloses Tool: http://www.extradata.com/products/jarc/
Bitte versuchen Sie es mit http://www.osjava.org/jardiff/ - das Tool ist alt und die Abhängigkeitsliste ist groß. Aus den Dokumenten geht hervor, dass es sich lohnt, es zu versuchen.
Verwenden Sie den Java-Dekompiler und dekompilieren Sie alle .class-Dateien und speichern Sie alle Dateien als Projektstruktur.
Verwenden Sie dann den Meld Diff Viewer und vergleichen Sie ihn als Ordner.