java - beyond - Comparando dos archivos.jar
beyond compare (11)
- Cambiar el nombre de .jar a .zip
- Extraer
- Descompilar archivos de clase con jad
- Dif Recursivo
¿Cómo comparo dos archivos .jar? Ambos han compilado archivos .class.
Quiero la diferencia en términos de cambios de método, etc.
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
Puedo ejecutarlo en Windows usando GIT para Windows. Simplemente abra un símbolo del sistema. Ejecuta bash y luego ejecuta el script desde allí.
Aquí hay una herramienta aparentemente gratuita http://www.extradata.com/products/jarc/
En Linux / CygWin una práctica secuencia de comandos que uso 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
Extraiga cada jar a su propio directorio usando el comando jar con los parámetros xvf. es decir, ''jar xvf myjar.jar'' para cada jar.
Luego, use el comando diff de UNIX 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 clase binarios son diferentes. Para comparar realmente los archivos de clase, tendrá que descompilarlos como lo anotaron otros.
Por favor, intente http://www.osjava.org/jardiff/ - la herramienta es antigua y la lista de dependencias es grande. De los documentos, parece que vale la pena intentarlo.
Si selecciona dos archivos en IntellijIdea y presiona Ctrl + D
, le mostrará la diferencia. Uso Ultimate y no sé si funcionará con Community Edition.
Utilice Java Decompiler para convertir el archivo jar en archivo de código fuente y luego use WinMerge para realizar la comparación.
Debe consultar al titular de los derechos de autor del código fuente para ver si está bien hacerlo.
Utilizo ZipDiff lib (tengo Java y Ant API).
utilice el descompilador de Java y descompile todos los archivos .class y guarde todos los archivos como estructura de proyecto.
luego usa meld diff viewer y compáralo como carpetas.
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
Vea el informe de muestra para args4j.
Clirr , uso de muestra:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar