比较两个.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

  1. 将.jar重命名为.zip
  2. 提取
  3. 用jad反编译类文件
  4. 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查看器并比较文件夹