Jak porównać dwa pliki .jar? Obaj skompilowali pliki .class.
Chcę różnicy w zakresie zmian metod itp.
Odpowiedzi:
JAPICC , przykład użycia:
japi-compliance-checker OLD.jar NEW.jar
Przykładowe raporty dla log4j: http://abi-laboratory.pro/java/tracker/timeline/log4j/
PkgDiff , przykładowe użycie:
pkgdiff OLD.jar NEW.jar
Zobacz przykładowy raport dla args4j.
Clirr , przykładowe użycie:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
Jeśli wybierzesz dwa pliki w IntellijIdea i naciśniesz, Ctrl + D
to pokaże ci różnicę. Używam wersji Ultimate i nie wiem, czy będzie działać w wersji Community .
jar
do wyodrębnienia zawartości, zamiast zmiany nazwy pliku i używania pkunzip
.)
javap -c
zachować kod bajtowy (zwłaszcza jeśli przez „zmiany metody” OP oznaczało zmiany w sygnaturze metody).
diff
zniweczyło javap
lub jad
wyjście z walki.
Rozpakuj każdy plik jar do jego własnego katalogu za pomocą polecenia jar z parametrami xvf. to znaczyjar xvf myjar.jar
dla każdego słoika.
Następnie użyj polecenia UNIX, diff
aby porównać dwa katalogi. To pokaże różnice w katalogach. Możesz użyć diff -r dir1 dir2
dwóch powtórzeń i pokazać różnice w plikach tekstowych w każdym katalogu (.xml, .properties itp.).
To również pokaże, czy pliki klas binarnych się różnią. Aby faktycznie porównać pliki klas, będziesz musiał je zdekompilować, jak zauważyli inni.
Oto mój skrypt do wykonania procesu opisanego przez 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}
Mogę go uruchomić w systemie Windows za pomocą GIT dla Windows. Po prostu otwórz wiersz polecenia. Uruchom bash, a następnie wykonaj skrypt stamtąd.
diff -r ${EXT_DIR1} ${EXT_DIR2}
lub ${DIFF} ${EXT_DIR1} ${EXT_DIR2}
(jeśli ponownie użyj zadeklarowanej zmiennej). Dla tych, którzy są na cygwin, skrypt prawie działał dla mnie, z wyjątkiem dwóch rzeczy, które zmieniłem: 1) Musiałem użyć wbudowanego javapa zamiast jad, ponieważ nie mogę pobrać jad (enterp. Firewall ... ); 2) jako jar xf
does't zrozumieć jak ścieżki /cygwin/c/rest/of/path
, który jest zwracany przez pwd
w Cygwin, miałem go przekonwertować do c:/rest/of/path
: JAR_DIR=${PWD}
, JAR_DIR=${JAR_DIR#*/cygdrive/c}
,JAR_DIR="c:$JAR_DIR"
jad
? Nie miej tego pliku binarnego dostępnego w PATH
foo/bar/toto.jar
), musisz dodać -p
argument do polecenia mkdir
W systemie Linux / CygWin przydatnym skryptem, którego czasami używam, jest:
#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
Użyj programu Java Decompiler, aby przekształcić plik jar w plik kodu źródłowego, a następnie użyj programu WinMerge, aby przeprowadzić porównanie.
Powinieneś skonsultować się z właścicielem praw autorskich do kodu źródłowego, aby sprawdzić, czy jest to w porządku.
użyj dekompilatora java i zdekompiluj wszystkie pliki .class i zapisz wszystkie pliki jako strukturę projektu.
następnie użyj przeglądarki meld diff i porównaj jako foldery.
Oto pozornie darmowe narzędzie http://www.extradata.com/products/jarc/
Spróbuj http://www.osjava.org/jardiff/ - narzędzie jest stare, a lista zależności jest duża. Z dokumentacji wynika, że warto spróbować.