Respostas:
JAPICC , amostra de uso:
japi-compliance-checker OLD.jar NEW.jar
Relatórios de amostra para log4j: http://abi-laboratory.pro/java/tracker/timeline/log4j/
PkgDiff , amostra de uso:
pkgdiff OLD.jar NEW.jar
Veja o relatório de amostra para args4j.
Clirr , amostra de uso:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
Se você selecionar dois arquivos em IntellijIdea e pressionar Ctrl + D
, será mostrado o diff. Eu uso o Ultimate e não sei se vai funcionar com a edição Community .
jar
para extrair o conteúdo, em vez de renomear o arquivo e usá-lo pkunzip
.)
javap -c
para mantê-lo em bytecode (especialmente se por "alterações de método" o OP significa alterações na assinatura de um método).
diff
ing de javap
ou jad
saída fora de sintonia.
Extraia cada jar para seu próprio diretório usando o comando jar com os parâmetros xvf. ou seja, jar xvf myjar.jar
para cada frasco.
Em seguida, use o comando UNIX diff
para comparar os dois diretórios. Isso mostrará as diferenças nos diretórios. Você pode usar diff -r dir1 dir2
dois recurse e mostrar as diferenças nos arquivos de texto em cada diretório (.xml, .properties, etc).
Isso também mostrará se os arquivos de classe binários são diferentes. Para realmente comparar os arquivos de classe, você terá que descompilá-los conforme observado por outros.
Aqui está meu script para fazer o processo 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
${DIFF} ${EXT_DIR1} ${EXT_DIR2}
Posso executá-lo no Windows usando o GIT para Windows. Basta abrir um prompt de comando. Execute o bash e execute o script a partir daí.
diff -r ${EXT_DIR1} ${EXT_DIR2}
ou ${DIFF} ${EXT_DIR1} ${EXT_DIR2}
(se reutilizar sua variável declarada). Para quem está no cygwin, o script quase funcionou para mim, exceto duas coisas que mudei: 1) Tive que usar o javap integrado em vez do jad, porque não consigo baixar o jad (enterp. Firewall ... ); 2) como jar xf
does't entender caminhos como /cygwin/c/rest/of/path
o que é retornado por pwd
no cygwin, eu tive que convertê-lo em c:/rest/of/path
: JAR_DIR=${PWD}
, JAR_DIR=${JAR_DIR#*/cygdrive/c}
,JAR_DIR="c:$JAR_DIR"
jad
? Não tem esse binário disponível no PATH
foo/bar/toto.jar
), você precisa adicionar o -p
argumento ao comando mkdir
No Linux / CygWin, um script útil que uso às vezes é:
#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
Use o Java Decompiler para transformar o arquivo jar em arquivo de código-fonte e, a seguir, use o WinMerge para realizar a comparação.
Você deve consultar o detentor dos direitos autorais do código-fonte, para ver se está correto fazer isso.
use o descompilador java e descompile todos os arquivos .class e salve todos os arquivos como a estrutura do projeto.
em seguida, use o meld diff viewer e compare como pastas.
Aqui está uma ferramenta aparentemente gratuita http://www.extradata.com/products/jarc/
Tente http://www.osjava.org/jardiff/ - a ferramenta é antiga e a lista de dependências é grande. Pela documentação, parece que vale a pena tentar.