Java 比较两个.jar文件
如何比较两个.jar文件? 它们都编译了.class文件 我希望在方法更改等方面有所不同。用于将jar文件转换为源代码文件,然后用于执行比较 您应该咨询源代码的版权所有者,看看这样做是否合适Java 比较两个.jar文件,java,jar,comparison,diff,Java,Jar,Comparison,Diff,如何比较两个.jar文件? 它们都编译了.class文件 我希望在方法更改等方面有所不同。用于将jar文件转换为源代码文件,然后用于执行比较 您应该咨询源代码的版权所有者,看看这样做是否合适 将.jar重命名为.zip 提取 使用 递归的 这里有一个完全免费的工具使用参数为xvf的jar命令将每个jar提取到它自己的目录中。i、 e.jar xvf myjar.jar用于每个jar 然后,使用UNIX命令diff比较这两个目录。这将显示目录中的差异。您可以使用diff-rdir1 dir2two
这里有一个完全免费的工具使用参数为xvf的jar命令将每个jar提取到它自己的目录中。i、 e.
jar xvf myjar.jar
用于每个jar
然后,使用UNIX命令diff
比较这两个目录。这将显示目录中的差异。您可以使用diff-rdir1 dir2
two recurse并显示每个目录(.xml、.properties等)中文本文件的差异
这还将显示二进制类文件是否不同。要实际比较类文件,您必须按照其他人的说明对它们进行反编译。请尝试-工具很旧,依赖项列表很大。从文档来看,它似乎值得一试。我使用lib(既有Java也有ant-API)。- ,示例用法:
log4j的示例报告:japi合规性检查程序OLD.jar NEW.jar
- ,示例用法:
有关args4j,请参阅pkgdiff OLD.jar NEW.jar
- ,示例用法:
java-jar-clirr-core-0.6-uber.jar-o OLD.jar-n NEW.jar
#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
使用并反编译所有.class文件,并将所有文件另存为项目结构
然后使用meld diff viewer并将其作为文件夹进行比较。以下是我的脚本,用于执行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,然后从那里执行脚本。如果您在IntellijIdea中选择两个文件,然后按
Ctrl+D
,它将显示差异。我使用的是Ultimate,不知道它是否可以与Community edition一起使用。创建一个文件夹并创建另外两个文件夹里面像旧的和新的一样。将相关jar文件添加到文件夹中。然后使用IntelliJ打开第一个文件夹。之后,单击要比较的两个文件,然后右键单击,然后单击比较存档谢谢。我试过这个。它以XML形式生成输出,如果在.jar中有许多类,则需要进一步处理以使其可读。对我来说,它抱怨缺少tools.jar。我确实使用JDK,所以这不是问题所在。我认为它不支持java7。@Tom链接断开了,这个答案可以删除。这是蛮力,但这正是我要做的。(除了我可能使用jar
来提取内容,而不是重命名文件并使用pkunzip
)或者用调用javap-c
来替换步骤3,以将其保留为字节码(特别是如果通过“方法更改”,OP意味着更改方法的签名)。如何处理在源文件中上移或下移的方法体?我认为这会使javap
或jad
的diff
输出变得不正常?它们来自同一个核心吗?@NikolayKuznetsov,不,这些工具有不同的核心。pkgdiff—类声明的可视化比较、japi符合性检查和clirr—更改分析(第一个是用perl编写的,第二个是用java编写的)。您是否尝试过与TeamCity集成一些东西?clirr似乎有一个Maven插件,还有一个叫做JAPI-Checker的工具。请注意,JAPI Compliance Checker和Pkgdiff并没有对所有内容进行比较。例如,所有方法实现都被忽略。只有方法签名、方法删除和API兼容性作为报告生成。如果你能比较二进制文件,那么你可以选择使用diff、cmp、IntelliJ插件等工具,甚至是Beyond Compare!似乎您错过了最后一行:diff-r${EXT\u DIR1}${EXT\u DIR2}
或${diff}${EXT\u DIR1}${EXT\u DIR2}
(如果重用声明的变量)。对于那些使用cygwin的人来说,除了两件我已经改变的事情外,这个脚本几乎对我起了作用:1)我不得不使用内置javap而不是jad,因为我无法下载jad(entrep.firewall;2) 由于jarxf
不理解cygwin中pwd
返回的/cygwin/c/rest/of/path
之类的路径,我必须将其转换为c:/rest/of/path
:jar_DIR=${pwd}
,jar DIR=${jar_DIR*/cygdrive/c}
,。最后一行是${DIFF}${EXT_DIR1}${EXT_DIR2}什么是jad
?PATHJad是一个Java反编译器,没有可用的二进制文件。我认为它不再被维护了,但我发现它在以下位置可用:如果您的参数(jar文件)位于子目录中(如foo/bar/toto.jar
),则需要将-p
参数添加到mkdircommand@ChristianNilsson,于2018年2月在Mac 10.14上运行,Mojave thoughI错误地选择了Maven包装器。在ExternalLibraries下,需要展开包装器,然后选择jar文件。谢谢@xueshengSuper easy solution。太棒了,这正是我想要的:)这对我很有效。非常感谢!