Respuestas:
JAPICC , uso de muestra:
japi-compliance-checker OLD.jar NEW.jar
Informes de muestra para log4j: http://abi-laboratory.pro/java/tracker/timeline/log4j/
PkgDiff , uso de muestra:
pkgdiff OLD.jar NEW.jar
Consulte el informe de muestra para args4j.
Clirr , uso de muestra:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
Si selecciona dos archivos en IntellijIdea y presiona Ctrl + D
, se le mostrará la diferencia. Utilizo Ultimate y no sé si funcionará con la edición Community .
jar
para extraer el contenido, en lugar de cambiar el nombre del archivo y usarlo pkunzip
).
javap -c
para mantenerlo en código de bytes (especialmente si por "cambios de método" el OP significa cambios en la firma de un método).
diff
ing javap
o la jad
salida.
Extraiga cada jar a su propio directorio usando el comando jar con los parámetros xvf. es decir, jar xvf myjar.jar
para cada frasco.
Luego, use el comando UNIX diff
para comparar los dos directorios. Esto mostrará las diferencias en los directorios. Puede usar diff -r dir1 dir2
dos recurse y mostrar las diferencias en los archivos de texto en cada directorio (.xml, .properties, etc.).
Esto también mostrará si los archivos de clases binarios difieren. Para comparar realmente los archivos de clase, tendrá que descompilarlos como lo indicaron otros.
Aquí está mi script para hacer el proceso descrito por 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}
Puedo ejecutarlo en Windows usando GIT para Windows. Simplemente abra un símbolo del sistema. Ejecute bash y luego ejecute el script desde allí.
diff -r ${EXT_DIR1} ${EXT_DIR2}
o ${DIFF} ${EXT_DIR1} ${EXT_DIR2}
(si reutiliza su variable declarada). Para aquellos que están en cygwin, el script casi funcionó para mí, excepto dos cosas que cambié: 1) Tuve que usar javap integrado en lugar de jad, porque no puedo descargar jad (enterp. Firewall ... ); 2) como jar xf
does't entender caminos como la /cygwin/c/rest/of/path
que se devuelve pwd
en cygwin, tuve que convertirlo a c:/rest/of/path
: JAR_DIR=${PWD}
, JAR_DIR=${JAR_DIR#*/cygdrive/c}
,JAR_DIR="c:$JAR_DIR"
jad
? No tengo ese binario disponible en PATH
foo/bar/toto.jar
), debe agregar el -p
argumento al comando mkdir
En Linux / CygWin, un script útil que utilizo a veces es:
#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
Use Java Decompiler para convertir el archivo jar en un archivo de código fuente y luego use WinMerge para realizar la comparación.
Debe consultar al propietario de los derechos de autor del código fuente para ver si está bien hacerlo.
utilice el decompilador de Java y descompile todos los archivos .class y guarde todos los archivos como estructura de proyecto.
luego use el visor de diferencias de meld y compare como carpetas.
Aquí hay una herramienta aparentemente gratuita http://www.extradata.com/products/jarc/
Intente http://www.osjava.org/jardiff/ - la herramienta es antigua y la lista de dependencias es grande. Según los documentos, parece que vale la pena intentarlo.