《文件对比》项目经验

151 阅读2分钟

项目背景

领导想看看现场包修改了哪些内容。

现场只有编译后的class文件。

公司环境拥有class和java文件

反编译器JD-GUI

case0 利用javap反编译对比

缺点:测试和生产都用javap反编译对比。但是因为两者的jdk不同和格式化的风格不同,任然会造成两者内容不同,但反编译后代码对比工具Beyond Compare存在不同。

case1(反编译)JDK包含javac可以编译.java文件,同时包含javap文件反编译.class文件

1.当时联想到既然node都有版本管理工具,java是否有呢,下载jenv

2.首先利用测试环境的相同版本jdk重新编译一次,再用他的jdk反编译(MANIFEST.MF文件可以查看该项目的jdk版本)

3.生产因为只有class文件,所以也用生产相同版本的jdk反编译一次。

case2 (java代码对比时间)因为前面方法太慢了

@Slf4j  
public class FileModifiedAfterSearcher {  
public static void main(String[] args) throws ParseException, IOException {  
String dir = "";//写上你需要对比文件的路径  
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
long modifiedAfter = dateFormat.parse("2021-12-30 18:30:00").getTime();  //输入文件最多的格式化时间
File dirFile = new File(dir);  
Files.find(dirFile.toPath(),Integer.MAX_VALUE,(t, u)-> t.toFile().isFile() && t.toFile().lastModified() > modifiedAfter).forEach(path -> {  
File file = path.toFile();  
log.info("文件【{}】修改于【{}】,可能存在与git不一致的情况",file.getAbsolutePath(), DateFormatUtils.format(new Date(file.lastModified()),"yyyy-MM-dd HH:mm:ss"));  
});  
}  
}
public static Stream<Path> find​(
  Path start,
  int maxDepth,
  BiPredicate<Path, ​BasicFileAttributes > matcher,
  FileVisitOption...options
) throws IOException

此方法作为walk()方法,因此它遍历当前文件树,从给定路径(start)开始,到达最大给定深度(maxDepth)。在当前文件树的迭代过程中,此方法应用给定的谓词(matcher)。通过这个谓词,我们指定最终流中的每个文件必须匹配的约束。或者,我们可以指定一组访问选项(options)。

总结一下这个case:1.写上你需要遍历的文件路2.大部分文件的时间3.调用Files.find判断时间和是否是文件和是否比大部分修改日期晚,再输出

case3 shell脚本

#!/bin/bash

设置目标目录和输入格式化后文件最多的时间

dir="E:\cocallDownload\李振洋\scxd-schj\WEB-INF" modified_after=$(date -d "2021-12-30 18:30:00" +%s)

定义函数用于输出日志信息

log_info() { file_path=1modifieddate=1 modified_date=2 echo "文件【filepath】修改于【{file_path}】修改于【{modified_date}】,可能存在与git不一致的情况" }

使用 find 命令查找目标目录下的所有文件,并进行筛选

find "$dir" -type f -exec bash -c '
    file_path="$1"
    modified_date=$(stat -c "%y" "$file_path") # 获取文件的修改时间

    # 将日期转换为时间戳(秒)
    modified_time=$(date -d "$modified_date" +%s)

    # 比较文件修改时间与输入的日期时间戳
    if [ $modified_time -gt '$modified_after' ]; then
        log_info "$file_path" "$modified_date" # 调用日志输出函数
    fi
' bash {} \;