web-dev-qa-db-fra.com

Comparer deux fichiers .jar

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.

88
Kunal
90
linuxbuild
  1. Renommez .jar en .Zip
  2. Extrait
  3. Décompiler les fichiers de classe avec jad
  4. Récursif diff
18
sje397

Si vous sélectionnez deux fichiers dans IntellijIdea et appuyez sur Ctrl + DAlors il va vous montrer le diff. J'utilise Ultimate et je ne sais pas si cela fonctionnera avec Communauté édition.

14
xuesheng

J'utilise to ZipDiff lib (avoir les deux Java et API ant)).

5
FoxyBOA

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.

4
Brian

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
2
SidJ

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à.

2
skanga

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.

1
Cheok Yan Cheng

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.

0
Jayan

Voici un outil apparemment gratuit http://www.extradata.com/products/jarc/

0
Tom

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.

0
Dulip Chandana