【发布时间】:2011-04-21 14:15:03
【问题描述】:
如何比较两个 .jar 文件? 他们都编译了.class文件。
我想要方法变化等方面的差异。
【问题讨论】:
标签: java jar comparison diff
如何比较两个 .jar 文件? 他们都编译了.class文件。
我想要方法变化等方面的差异。
【问题讨论】:
标签: java jar comparison diff
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
【讨论】:
如果您在 IntellijIdea 中选择两个文件并按Ctrl + D,那么它将显示差异。我使用 Ultimate,不知道它是否适用于 Community 版本。
【讨论】:
使用带有参数xvf 的jar 命令将每个jar 解压到它自己的目录中。即每个罐子的jar xvf myjar.jar。
然后,使用 UNIX 命令diff 比较两个目录。这将显示目录中的差异。您可以使用diff -r dir1 dir2 两次递归并显示每个目录(.xml、.properties 等)中文本文件的差异。
这也将显示二进制类文件是否不同。要实际比较类文件,您必须按照其他人的说明对它们进行反编译。
【讨论】:
我使用ZipDiff lib(同时拥有Java和ant API)。
【讨论】:
创建一个文件夹并在其中创建另外 2 个文件夹,就像旧的和新的一样。将相关的 jar 文件添加到文件夹中。然后使用 IntelliJ 打开第一个文件夹。之后,单击您要比较的任何 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
${DIFF} ${EXT_DIR1} ${EXT_DIR2}
我可以使用 GIT for Windows 在 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之类的路径,在cygwin中由pwd返回,我不得不将其转换为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 命令
使用Java Decompiler将jar文件转为源代码文件,然后使用WinMerge进行比较。
您应该咨询源代码的版权所有者,看看是否可以这样做。
【讨论】:
在 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反编译所有.class文件并将所有文件保存为项目结构。
然后使用融合差异查看器并作为文件夹进行比较..
【讨论】:
这是一个明显免费的工具http://www.extradata.com/products/jarc/
【讨论】:
请尝试http://www.osjava.org/jardiff/ - 工具旧且依赖列表很大。从文档来看,它看起来值得一试。
【讨论】:
此应用程序可能是您所需要的,运行良好,并显示一个简单的 GUI,显示差异。试试Jarcomp
【讨论】:
如果您使用的是 IntelliJ IDEA 或 Android Studio,请将您的 jar 文件添加到 libs 文件夹下的项目中。 然后选择这两个jar文件,右键单击然后选择“Compare Archives”
【讨论】: