比较两个.jar文件
如何比较两个.jar文件? 他们都编译了.class文件。
我想在方法变化等方面的差异
-
JAPICC ,样本用法:
japi-compliance-checker OLD.jar NEW.jar
log4j示例报告: http : //abi-laboratory.pro/java/tracker/timeline/log4j/
-
PkgDiff ,示例用法:
pkgdiff OLD.jar NEW.jar
请参阅args4j的示例报告 。
-
Clirr ,样本用法:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
- 将.jar重命名为.zip
- 提取
- 用jad反编译类文件
- recursion差异
我使用ZipDiff lib(同时拥有Java和Ant API)。
使用带有参数xvf的jar命令将每个jar解压到它自己的目录。 即每个jar子的“jar xvf myjar.jar”。
然后,使用UNIX命令diff来比较这两个目录。 这将显示目录中的差异。 您可以使用'diff -r dir1 dir2'两个recursion并显示每个目录(.xml,.properties等)中文本文件的差异。
这也将显示如果二进制类文件不同。 要实际比较类文件,您必须按照其他人的说明反编译它们。
在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
这是我的脚本来完成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
我可以使用GIT for Windows在Windows上运行它。 只要打开一个命令提示符。 运行bash,然后从那里执行脚本。
如果您在IntellijIdea中select两个文件,然后按Ctrl + D
,则会显示diff。 我使用Ultimate版 ,不知道它是否可以与Community版一起使用。
使用Java Decompiler将jar文件转换为源代码文件,然后使用WinMerge进行比较。
你应该咨询源代码的版权所有者,看看是否可以这样做。
这是一个免费的免费工具http://www.extradata.com/products/jarc/
请尝试http://www.osjava.org/jardiff/ – 工具是旧的,依赖列表很大。 从文档看,这似乎值得尝试。
使用java反编译器 ,反编译所有.class文件,并将所有文件保存为项目结构。
然后使用meld diff查看器并比较文件夹