Answers:
如果您在IntellijIdea中选择两个文件,然后按Ctrl + D
,它将显示差异。我使用Ultimate,但不知道它是否可以与Community Edition一起使用。
jar
用来提取内容,而不是重命名文件并使用pkunzip
。)
javap -c
要保留其字节码的调用(特别是如果通过“方法更改”,OP意味着更改了方法的签名)。
diff
的ING javap
或jad
输出不正常的。
这是我执行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}
我可以使用Windows的GIT在Windows上运行它。只需打开命令提示符。运行bash,然后从那里执行脚本。
diff -r ${EXT_DIR1} ${EXT_DIR2}
或${DIFF} ${EXT_DIR1} ${EXT_DIR2}
(如果重复使用声明的变量)。对于那些使用cygwin的人来说,该脚本几乎对我有用,除了我已更改的两件事:1)我不得不使用内置javap而不是jad,因为我无法下载jad(enterp.firewall ... ); 2)作为jar xf
简化版,了解路径就像/cygwin/c/rest/of/path
是由返回pwd
Cygwin中,我不得不将其转换为c:/rest/of/path
:JAR_DIR=${PWD}
,JAR_DIR=${JAR_DIR#*/cygdrive/c}
,JAR_DIR="c:$JAR_DIR"
jad
啊 PATH中没有可用的二进制文件
foo/bar/toto.jar
)中,则需要将-p
参数添加到mkdir命令
在Linux / CygWin中,我有时使用的便捷脚本是:
#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
使用Java Decompiler将jar文件转换为源代码文件,然后使用WinMerge进行比较。
您应该咨询源代码的版权所有者,以查看是否可以这样做。
使用 Java反编译器并反编译所有.class文件,并将所有文件另存为项目结构。
然后使用diff比较查看器并将其作为文件夹进行比较。
这是一个显然免费的工具http://www.extradata.com/products/jarc/
请尝试http://www.osjava.org/jardiff/-工具较旧,依赖项列表较大。从文档来看,它似乎值得尝试。