Comment comparer deux fichiers .jar? Les deux ont des fichiers .class compilés.
Je veux la différence en termes de changement de méthode, etc.
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 , exemple d'utilisation:
pkgdiff OLD.jar NEW.jar
Voir exemple de rapport pour args4j.
Clirr , exemple d'utilisation:
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
Alors il va vous montrer le diff. J'utilise Ultimate et je ne sais pas si cela fonctionnera avec Communauté édition.
J'utilise to ZipDiff lib (avoir les deux Java et API ant)).
Extrayez chaque fichier jar dans son propre répertoire à l'aide de la commande jar avec les paramètres xvf. c'est à dire. jar 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 utiliser diff -r dir1 dir2
deux fois et affichez les différences entre les fichiers texte de chaque répertoire (.xml, .properties, etc.).
Cela montrera également si les fichiers de classe binaires diffèrent. Pour comparer réellement les fichiers de classe, vous devrez les décompiler comme indiqué par d'autres.
Dans Linux/CygWin, un script pratique que j'utilise parfois est le suivant:
#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
Voici mon script pour effectuer 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
Je peux l'exécuter sur Windows en utilisant GIT pour Windows. Ouvrez juste une invite de commande. Exécutez bash puis exécutez le script à partir de là.
Utilisez Java Decompiler pour convertir le fichier jar en fichier de code source, puis utilisez WinMerge pour effectuer une comparaison.
Vous devriez consulter le détenteur des droits d'auteur du code source, pour voir si vous pouvez le faire.
S'il vous plaît essayez http://www.osjava.org/jardiff/ - outil est ancien et la liste de dépendance est grande. De la documentation, il semble que ça vaut la peine d'essayer.
Voici un outil apparemment gratuit http://www.extradata.com/products/jarc/
utilisez Java decompiler 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.