是否可以检查给定的Java二进制文件是否已使用给定的源代码进行编译。
当前,我有一个由供应商构建的项目(WAR文件)。这个项目的源代码将在几个月后发布,但是我的上司问我如何知道我们在生产中部署的WAR文件是否由将来将提供给我们的源代码生成。
供应商建议使用pkgdiff,但我不确定这是否检查方法的实现,而不仅仅是方法签名。
任何人都可以建议任何方法或工具以确保给定的源代码是用于制作二进制文件(Java WAR文件)的方法或工具
我也读过这个问题How to check if binaries are built from particular sources是接受的答案是100%确定的唯一真实选择吗?
谢谢。
答案 0 :(得分:0)
尝试解压缩war文件并使用javap
工具,比较每对.class文件输出的MD5校验和
javap -sysinfo orig/src/com/example/ClassA.class local/src/com/example/ClassA.class | grep MD5
MD5 checksum abd302fa751dd9a6e86b18674397140a
MD5 checksum abd302fa751dd9a6e86b18674397140a
已编译代码的校验和应该相同。 使用shell脚本,您可以执行以下操作:
javap -sysinfo ../ClassA.class ClassA.class | \
gawk 'BEGIN{ RS="^[}]$"; FS="\n" } { if(NR == 1){ md1=$3; cn=$1} }; END{ if($3 == md1){print "OK!",cn,md1,$3} else{ print "Failed",cn,md1,$3 }}'
结果:
OK! Classfile /home/luis/tmp/ClassA.class MD5 checksum abd302fa751dd9a6e86b18674397140a MD5 checksum abd302fa751dd9a6e86b18674397140a
或者登录失败:
Failed Classfile /home/luis/tmp/ClassA.class MD5 checksum abd302fa751dd9a6e86b18674397140a MD5 checksum abd302fa751dd9a6e86b18674397140a