您的位置:首页 > 其它

ANT includesfile 标签的内容模式匹配

2016-11-14 17:28 330 查看
在弄SVN log增量打更新包的ANT配置,遇到这个坑,特此记录 。

现象:log文件处理出来文件列表了,但是打成更新包后发现,只有 class 文件打进去了,其他所有文件(jsp,css,js,img)等都打不进去。同时,提供的文件列表上记录的文件路径名称确定正确。

SVN 处理后:

错误的文件列表样例:

/WEB-INF/classes/com/onegrid/darj/web/action/DossierTabledataAction*.class
/main/fullSearchGroups.jsp

正确的文件列表样例:

/WEB-INF/classes/com/onegrid/darj/web/action/DossierTabledataAction*.class
/main/fullSearchGroups.jsp*

大家都知道,java因为可能有内部类的问题,所以class文件可能有Test$1.class 这种样子的,故而,读取文件时,使用模式星号(*)匹配是可以理解并想到的。

但是为什么读取jsp等文件,最后也要加个星号才能读取呢?其实我也不知道为什么,起先也很难想到这个问题上,所以我只能说,ANT神经病呗。

那么,它既然神经病了,但我们还要用,那只能满足这种星号匹配的要求啦。咱是要用,不能和神经病抬杠。

那么,问题来了:怎么满足最后多个星号呢?其实很简单,给log处理替换表达式,目标量最后加个星号就行了。

附上我的ANT.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="project" default="patch_without_compile">
<!-- TLBADX 项目 -->
<property name="project.name" value="cqdx" />
<tstamp>
<format property="date.today" pattern="yyyyMMdd" />
</tstamp>
<!-- svn提交change日志 -->
<property name="change.log" value="C:/Users/Administrator/Desktop/changeLog.txt" />
<!-- 补丁包所在目录 -->
<property name="build.dir" value="C:/Users/Administrator/Desktop/release" />
<!-- tomcat 下编译好的本项目根目录 -->
<property name="tomcat.porject.dir" value="E:/tom/webapps/darj-v2.0/" />
<!-- 读取svn日志提取出新增和修改文件 获取补丁包包含的文件 -->
<property name="patch.includesfile" value="${build.dir}/patchfiles.txt" />
<!-- 补丁包名称 -->
<property name="dest.zip" value="${project.name}_${date.today}_patch.zip" />

<!-- - - - - - - - - - target:从svn日志中,取出checkin文件 - - - - - - - - - -->
<target name="patchfile" depends="init" description="处理 svn_changge 日志 ">
<!-- 去掉 SVN日志中的注释,只保留Added和Modified记录 -->
<concat destfile="${patch.includesfile}" append="false" force="true">
<fileset file="${change.log}" />
<filterchain>
<containsregex byline="true" pattern="^([\s]+)(?:A|M)([\s]+)(.+)$"
replace="\3" />
</filterchain>
</concat>

<!-- 将src目录替换为classes目录 主要针对提交的代码 -->
<replaceregexp file="${patch.includesfile}" byline="true">
<!-- (?:X) X作为非捕获组 相当于java的group概念 提取出代码的相对路径 -->
<regexp pattern="^/.+/(?:src)/(.+)\..+$" />
<substitution expression="/WEB-INF/classes/\1*.class" />
</replaceregexp>
<!-- 替换掉WebRoot/前面的路径 主要针对提交.js .css 等图片页面文件 -->
<replaceregexp file="${patch.includesfile}" byline="true">
<!-- (?=X) 从句子前面读取 如果X前面为空直接略过。 前面不为空的执行替换操作 -->
<regexp pattern="^/.+/(?:WebRoot)/(.+)$" />
<substitution expression="/\1*" />
</replaceregexp>
</target>

<!-- - - - - - - - - - target:package - - - - - - - - - -->
<target name="package" description="补丁包">
<delete file="${build.dir}/${dest.zip}" />
<zip destfile="${build.dir}/${dest.zip}" baseDir="${tomcat.porject.dir}"
compress="true" includesfile="${patch.includesfile}" />
</target>

<!-- - - - - - - - - - target:release without compile - - - - - - - - - -->
<target name="patch_without_compile" depends="patchfile, package"
description="go release">
<echo>补丁包打包结束</echo>
</target>

<!-- - - - - - - - - -target: init - - - - - - - - - -->
<target name="init" depends="clean">
<mkdir dir="${build.dir}" />
</target>

<!-- - - - - - - - - -target: clean - - - - - - - - - -->
<target name="clean">
<delete dir="${build.dir}" />
</target>

</project>

再次提醒,注意点:第二个处理svn log 的正则表达式 expression="/\1*" ! 这个1后面的星号(*)。

好了,还不知道怎么用SVN Log抽增量更新包的小伙伴,请去别人家看。地址如下:
http://www.cnblogs.com/stay-9527/p/3996025.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ANT includesfile标签