risposta-alla-domanda-sullo-sviluppo-web-bd.com

Confronto tra due file .jar

Come faccio a confrontare due file .jar? Entrambi hanno compilato file .class.

Voglio la differenza in termini di cambi di metodo, ecc.

88
Kunal
90
linuxbuild
  1. Rinomina .jar in .Zip
  2. Estratto
  3. Decompilare i file di classe con jad
  4. Ricorsivo diff
18
sje397

Se selezioni due file in IntellijIdea e premi Ctrl + Dquindi ti mostrerà il diff. Uso Ultimate e non so se funzionerà con Community edizione.

14
xuesheng

Uso ZipDiff lib (ho entrambi Java e ant API).

5
FoxyBOA

Estrarre ogni jar nella propria directory utilizzando il comando jar con i parametri xvf. cioè jar xvf myjar.jar per ogni barattolo.

Quindi, utilizzare il comando UNIX diff per confrontare le due directory. Questo mostrerà le differenze nelle directory. Puoi usare diff -r dir1 dir2 due recurse e mostrano le differenze nei file di testo in ciascuna directory (.xml, .properties, ecc.).

Ciò mostrerà anche se i file di classe binari differiscono. Per confrontare effettivamente i file di classe dovrai decompilarli come notato da altri.

4
Brian

In Linux/CygWin uno script utile che uso a volte è:

#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

Ecco il mio script per eseguire il processo descritto da 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

Posso eseguirlo su Windows usando GIT per Windows. Basta aprire un prompt dei comandi. Esegui bash e quindi esegui lo script da lì.

2
skanga

Utilizzare Java Decompiler per trasformare il file jar in file di codice sorgente, quindi utilizzare WinMerge per eseguire il confronto.

Dovresti consultare il detentore del copyright del codice sorgente, per vedere se è OK farlo.

1
Cheok Yan Cheng

Prova http://www.osjava.org/jardiff/ - lo strumento è vecchio e l'elenco delle dipendenze è grande. Dai documenti, sembra che valga la pena provare.

0
Jayan

Ecco uno strumento altrettanto gratuito http://www.extradata.com/products/jarc/

0
Tom

usa Java decompiler e decompila tutti i file .class e salva tutti i file come struttura del progetto.

quindi usa meld diff viewer e confronta come cartelle ..

0
Dulip Chandana