Réponses:
JAPICC , exemple d'utilisation:
japi-compliance-checker OLD.jar NEW.jar
Exemples de rapports pour log4j: http://abi-laboratory.pro/java/tracker/timeline/log4j/
PkgDiff , utilisation de l'échantillon:
pkgdiff OLD.jar NEW.jar
Voir un exemple de rapport pour args4j.
Clirr , utilisation de l'échantillon:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
Si vous sélectionnez deux fichiers dans IntellijIdea et appuyez sur, Ctrl + D
il vous montrera le diff. J'utilise Ultimate et je ne sais pas si cela fonctionnera avec l' édition communautaire .
jar
pour extraire le contenu, au lieu de renommer le fichier et de l'utiliser pkunzip
.)
javap -c
pour le conserver au bytecode (surtout si par "method changes" l'OP signifiait des changements dans la signature d'une méthode).
diff
ing javap
ou la jad
sortie.
Extrayez chaque fichier jar dans son propre répertoire à l'aide de la commande jar avec les paramètres xvf. c'est à direjar xvf myjar.jar
à- pour chaque pot.
Ensuite, utilisez la commande UNIX diff
pour comparer les deux répertoires. Cela montrera les différences dans les répertoires. Vous pouvez utiliserdiff -r dir1 dir2
deux recurse et afficher les différences dans les fichiers texte dans chaque répertoire (.xml, .properties, etc.).
Cela montrera également si les fichiers de classe binaire diffèrent. Pour comparer réellement les fichiers de classe, vous devrez les décompiler comme indiqué par d'autres.
Voici mon script pour faire le processus décrit par 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}
Je peux l'exécuter sur Windows en utilisant GIT pour Windows. Ouvrez simplement une invite de commande. Exécutez bash, puis exécutez le script à partir de là.
diff -r ${EXT_DIR1} ${EXT_DIR2}
ou ${DIFF} ${EXT_DIR1} ${EXT_DIR2}
(si vous réutilisez votre variable déclarée). Pour ceux qui sont sur cygwin, le script a presque fonctionné pour moi, sauf deux choses que j'ai changées: 1) J'ai dû utiliser javap intégré au lieu de jad, car je ne peux pas télécharger jad (enterp. Firewall ... ); 2) jar xf
does't comprendre des chemins comme /cygwin/c/rest/of/path
qui est retourné par pwd
dans Cygwin, je devais le convertir en c:/rest/of/path
: JAR_DIR=${PWD}
, JAR_DIR=${JAR_DIR#*/cygdrive/c}
,JAR_DIR="c:$JAR_DIR"
jad
? Ne pas avoir ce binaire disponible dans PATH
foo/bar/toto.jar
Si vos arguments (fichiers jar) sont dans un sous-répertoire (comme ), vous devez ajouter l' -p
argument à la commande mkdir
Dans Linux / CygWin, un script pratique que j'utilise parfois est:
#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
Utilisez Java Decompiler pour transformer le fichier jar en fichier de code source, puis utilisez WinMerge pour effectuer la comparaison.
Vous devriez consulter le détenteur des droits d'auteur du code source, pour voir s'il est acceptable de le faire.
utiliser le décompilateur java et décompilez tous les fichiers .class et enregistrez tous les fichiers en tant que structure de projet.
puis utilisez meld diff viewer et comparez en tant que dossiers.
Voici un outil totalement gratuit http://www.extradata.com/products/jarc/
Veuillez essayer http://www.osjava.org/jardiff/ - l'outil est ancien et la liste de dépendances est longue. D'après la documentation, cela vaut la peine d'essayer.