有没有一种方法可以比较两个Java war文件?

10

我们之前为我们的Web服务器构建了一些war文件,现在重新构建了它们。

为确保没有任何改变(作为质量检查),我们尝试使用WinMerge进行比较。我们看到的差异似乎是由某种元数据引起的,例如文件构建日期不同?

这些行之间的差异似乎是一致的,例如:

«d}<

³Ze<

这两个war文件的大小仍然相同。

是否有一种方法可以比较它们并剥离日期等元数据?

7个回答

10

通常我会采用这样的方法,运行2个unzip命令并根据需要diff输出。例如,我需要比较两个Java WAR文件。

$ sdiff --width 160 \
   <(unzip -l -v my_num1.war | cut -c 1-9,59-,49-57 | sort -k3) \
   <(unzip -l -v my_num2.war | cut -c 1-9,59-,49-57 | sort -k3)

导致输出如下:

--------          -------                                                       --------          -------
Archive:                                                                        Archive:
-------- -------- ----                                                          -------- -------- ----
48619281          130 files                                                   | 51043693          130 files
    1116 060ccc56 index.jsp                                                         1116 060ccc56 index.jsp
       0 00000000 META-INF/                                                            0 00000000 META-INF/
     155 b50f41aa META-INF/MANIFEST.MF                                        |      155 701f1623 META-INF/MANIFEST.MF
 Length   CRC-32  Name                                                           Length   CRC-32  Name
    1179 b42096f1 version.jsp                                                       1179 b42096f1 version.jsp
       0 00000000 WEB-INF/                                                             0 00000000 WEB-INF/
       0 00000000 WEB-INF/classes/                                                     0 00000000 WEB-INF/classes/
       0 00000000 WEB-INF/classes/com/                                                 0 00000000 WEB-INF/classes/com/
...
...

我更喜欢这种方法,因为它不需要空间来解压缩文件,然后再比较它们。


这里 cut -c 1-9,59-,49-57 的意义是什么? - Ajay Kumar
@AjayKumar - 我正在解析 unzip 命令的输出,有选择性地从中提取某些字符范围。请在此处查看一个示例,了解解压 WAR 文件后其外观 - https://www.baeldung.com/linux/extract-war。 - slm

7

WAR文件基本上就是Zip文件。为什么不解压缩内容并逐个比较每个文件呢?这样可以避免任何作为WAR文件一部分的元数据。如果发现有任何差异,您还可以弄清楚实际上是什么差异。


1
解压缩后,https://dev59.com/T0XRa4cB1Zd3GeqPpjCn 可能会有所帮助。 - Anonymoose
两个很好的答案 - 这个答案是先到达的(早了7秒),所以这个被接受了。 - rbrayb

7

如果您先解压缩文件夹,然后再进行比较,会更加容易。

在Windows中,您可以使用随JDK一起提供的“jar”可执行文件。

jar -xvf xxxx.war

然后您可以使用WinMerge来比较这两个文件夹。希望这可以帮到您。

6

您可以使用Eclipse来比较Jar/War文件。

http://www.javalobby.org/java/forums/m91839415.html

该链接未提到War文件。我正在使用Indigo,它似乎只支持Jar文件的比较,因此我不得不将War扩展名重命名为Jar以便让Eclipse进行结构比较。


4

只需使用 pkgdiff:

pkgdiff a.war b.war

这个工具在Linux上易于使用,输出结果也相当易于解析(您还可以从bash脚本中检查状态代码)。它还能生成一个漂亮的HTML报告。


0

如果您安装了WinMerge的7zip插件,就可以配置WinMerge来比较zip文件(顺便说一下,.WAR文件也是如此)。

请记住,这并不是很容易安装,您必须安装插件,它由.dll制成,并且必须提取到一个文件夹中...老实说,我不记得我是怎么做到的了。

我相信最后我使用了独立安装程序选项,并使用了9.20版本的插件。

虽然有时候,WinMerge告诉我.class文件存在差异,但它会突出显示二进制行,但我看不到任何差异。至少您可以比较war文件夹结构。


0

使用“Beyond Compare”免费试用版...(或购买它) 我认为这是唯一能够做到的工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接