如何比较两个.jar文件? 它们都有编译的.class文件。
我希望在方法更改等方面有所不同。
答案 0 :(得分:86)
JAPICC,示例用法:
japi-compliance-checker OLD.jar NEW.jar
log4j的示例报告:http://abi-laboratory.pro/java/tracker/timeline/log4j/
PkgDiff,示例用法:
pkgdiff OLD.jar NEW.jar
有关args4j的信息,请参阅sample report。
Clirr,示例用法:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
答案 1 :(得分:18)
答案 2 :(得分:12)
如果您在 IntellijIdea 中选择两个文件并按Ctrl + D
,则会显示差异。我使用 Ultimate 并且不知道它是否适用于社区版本。
答案 3 :(得分:5)
我使用ZipDiff lib(同时拥有Java和ant API)。
答案 4 :(得分:4)
使用带有参数xvf的jar命令将每个jar解压缩到它自己的目录。即每个罐子jar xvf myjar.jar
。
然后,使用UNIX命令diff
比较两个目录。这将显示目录中的差异。您可以使用diff -r dir1 dir2
两个递归并显示每个目录(.xml,.properties等)中文本文件的差异。
这也将显示二进制类文件是否不同。要实际比较类文件,您必须按其他人的说明对它们进行反编译。
答案 5 :(得分:4)
创建一个文件夹并在其中创建另外两个文件夹,就像新旧一样。将相关的 jar 文件添加到文件夹中。然后使用 IntelliJ 打开第一个文件夹。然后点击您想要比较的任意 2 个文件,然后右键点击并点击比较档案。
答案 6 :(得分:2)
在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
答案 7 :(得分:2)
这是我的脚本,用于执行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
我可以在Windows上使用GIT for Windows运行它。只需打开命令提示符。运行bash,然后从那里执行脚本。
答案 8 :(得分:1)
使用Java Decompiler将jar文件转换为源代码文件,然后使用WinMerge进行比较。
您应该咨询源代码的版权所有者,看看是否可以这样做。
答案 9 :(得分:0)
这是一个非常免费的工具http://www.extradata.com/products/jarc/
答案 10 :(得分:0)
请尝试http://www.osjava.org/jardiff/ - 工具已过时且依赖关系列表很大。从文档来看,它看起来值得尝试。
答案 11 :(得分:0)
使用java decompiler并反编译所有.class文件并将所有文件保存为项目结构。
然后使用meld diff viewer并比较为文件夹..