1、怎么判断两个文件是不是同一个文件呢?根据文件名肯定是不行的,因为即使文件名相同,也可以是两个完全不同的文件,即使文件名不同,也可能是相同的两个文件。这里就要用到md5这个概念,MD5就类似于我们的指纹,每个文件都有一个md5值,只要你对文件做了一丁点修改,文件的md5值就会发生巨大的改变。如下面图中所示:先创建一个文件test,计算md5值,然后往里面写入一个0,再计算md5值。计算md5值用的是shell的md5sum命令,可以看到,就写入了一个0值,但是他们的md5值发生了巨大的变化。md5值的输出格式是"md5值 - 文件名"
2、因此就可以根据文件的这个特性来对要发布的项目包进行区分。如下面图中所示,当前目录下有一个ROOT.war包,然后还有一个待发布的项目目录,目录底下也有一个ROOT.war包。现在我们就需要来判断,待发布目录下的war包是否是可以发布的新包。
3、如下面第一张图中所示,我们创建了一个脚本,叫做check.sh,用来检查两个文件是否相同。脚本的内容如第二张图中所示,解释如下:首先我们取得两个文件的路径然后依次计算两个文件的md5值,使用cut命令去掉md5值后面的文件名,只需要前面的md5值。取得md5值以后,在if函数里对md5值进行判断,看两个文件是不是相同的文件,如果是相同的,则输出他们是相同文件的提示如果不是相同的,那么进行下一步操作。
4、执行后的结果如下面所示,可以看到两个相同文件名的文件md5值并不相同,说明可以进行下一步操作。
5、这里还不能立即更新,因为可能一不小心把之前旧的项目包弄到待发布的目录中了,因此我们需要第二个判断条件,就是判断文件的修改时间。这个时候就要用到第二个命令stat,命令的用法如下面图中所示,即stat -c %Y ROOT.war-c 表示后面跟一个格式化字符串,%Y的意思是输出这个文件被修改的时间,以秒来显示。从图中可以看到,两个文件的修改时间完全不同,因此就可以根据这个来进行对吧。
6、于是在脚本判断文件md5值不同后,进行下一步操作就是比较他们的修改时间差异。如下面图中所示:先依次计算两个文件的修改时间然后计算两个文件的时间差值再将文件的差值和0进行比较。按照正常情况,待发布的文件修改时间肯定更大,因此它们的差值肯定是大于0的,如果大于0,即待发布的文件比外面的文件更新,如果小于0,即待发布的文件比正在用的文件旧,就不能发布了。
7、执行结果如下所示,确实是待发布的文件内容更新。
8、然后我们就可以在这个判断条件下进行最后一步操作了,将待发布的新文件复制到tomcat的项目目录下,而且是强制覆盖。这样tomcat检测到新文件后,就会加载新项目中的内容。更新网站。