项目背景
领导想看看现场包修改了哪些内容。
现场只有编译后的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=2 echo "文件【{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 {} \;