Jak porównać dwa pliki .jar? Obaj skompilowali pliki .class.
Chcę różnicy w zakresie zmian metod itp.
java
jar
comparison
diff
Kunal
źródło
źródło
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 .źródło
źródło
jar
do wyodrębnienia zawartości, zamiast zmiany nazwy pliku i używaniapkunzip
.)javap -c
zachować kod bajtowy (zwłaszcza jeśli przez „zmiany metody” OP oznaczało zmiany w sygnaturze metody).diff
zniweczyłojavap
lubjad
wyjście z walki.Używam do ZipDiff lib (mam zarówno Java, jak i ANT API).
źródło
Rozpakuj każdy plik jar do jego własnego katalogu za pomocą polecenia jar z parametrami xvf. to znaczy
jar 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.
źródło
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.
źródło
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) jakojar xf
does't zrozumieć jak ścieżki/cygwin/c/rest/of/path
, który jest zwracany przezpwd
w Cygwin, miałem go przekonwertować doc:/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 PATHfoo/bar/toto.jar
), musisz dodać-p
argument do polecenia mkdirW 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
źródło
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.
źródło
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.
źródło
Oto pozornie darmowe narzędzie http://www.extradata.com/products/jarc/
źródło
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ć.
źródło