# CompareJar **Repository Path**: yuweichu/CompareJar ## Basic Information - **Project Name**: CompareJar - **Description**: 用来比较两个jar里面东西的差异 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-01-14 - **Last Updated**: 2022-01-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CompareJar 对比两个JAR包 给定两个jar包路径和工作目录,该main方法会解压这两个jar包到工作目录,并对解压出的文件 算MD5,然后一个个比对相对路径一致的文件MD5, 最后给出 “老的有,新的没有”,“新的有老的没有”,“新老不一致”的文件有哪些。 ## 一、使用方法 ### (一)修改main方法 ``` //aPath改成老jar包的位置 String aPath = "D:\\DEV\\compare\\external-mng-bootstrap-1.0.2.old.jar"; //bPath改成新jar包的位置 String bPath = "D:\\DEV\\compare\\external-mng-bootstrap-1.0.2.recompile.jar"; //workSpace改成希望jar包解压到的位置 String workSpace = "D:\\DEV\\compare\\workspace"; CompareExecutor executor = new CompareExecutor(); executor.compareJar(aPath, bPath, workSpace); System.out.println("完成"); ``` ### (二)运行后处理逻辑 #### 1、 运行后会解压jar包到工作路径 按照上面的例子,就是下面两个路径: D:\DEV\compare\workspace\external-mng-bootstrap-1.0.2.old.jar_old D:\DEV\compare\workspace\external-mng-bootstrap-1.0.2.old.jar_new #### 2、解压后会遍历路径下所有文件计算MD5 ![image](sample/解压后会遍历路径下所有文件计算MD5.png) 日志会记在D:\DEVOUTPUT\logs\CompareJar下,可以手动修改log4j.properties 来指定日志路径。 #### 3、根据相对路径,比对里面每个文件MD5,输出差异结果 ![image](sample/差异结果.png) ## 二、一个半自动对比两个jar包完整的例子 ### (一)准备工作 ![image](sample/准备工作.png) 准备了三个jar:老的、源码不改重新打包、里面改了个类打包。 源码不改的就不对比了,直接对改了个类的打包。 ### (二)第一次对比 ![image](sample/第一次对比.png) ### (三)换参数进行第二次对比 #### 1、继续对比impl 在main方法指定apath、bpath为刚刚输出的参数: D:\DEV\compare\workspace\external-mng-bootstrap-1.0.2.old.jar_old\BOOT-INF\lib\external-mng-impl-1.0.2.jar D:\DEV\compare\workspace\external-mng-bootstrap-1.0.2.modified.jar_new\BOOT-INF\lib\external-mng-impl-1.0.2.jar ![image](sample/继续对比impl.png) #### 2、继续对比facade 在main方法指定apath、bpath为刚刚输出的参数: D:\DEV\compare\workspace\external-mng-bootstrap-1.0.2.old.jar_old\BOOT-INF\lib\external-mng-facade-1.0.2.jar D:\DEV\compare\workspace\external-mng-bootstrap-1.0.2.modified.jar_new\BOOT-INF\lib\external-mng-facade-1.0.2.jar ![image](sample/继续对比facade.png) ### (四)其他说明 (1)对相同代码,打包的两次jar,MD5是不一样的。 (2)对相同代码,相同编译器,多次编译的CLASS文件,MD5是一致的。 (3)如果比对两个jar包,发现里面有两个引的jar包MD5不一致,需要再进行比对,因此可能只是重新打包过了并不一定是改了代码。 (4)在实际项目组,经常会出现同版本号的jar在不同项目中引用的代码不同(改代码后不升级版本号就deploy了),使用该工具来解决历史问题,然后避免版本号不升级就改代码吧。 (5)如果删掉了代码里的匿名内部类,那么表现会是某个<类名$n.class>文件老的有新的没有。