Ant 扩展(一)
一、為啥要用Ant-Contrib ?
???? 因為要做一個循環,用戶配置兩個或多個工程名后,這兩個或多個工程有相同的工程結構,但是是屬于不同的項目,如果把這個兩個項目的工程整合成一個,寫一個build,自動的把這幾個工程進行合并。
??? 看了一下ant,沒有java中類似于下面代碼的功能,所以找到Ant-Contrib,聽說這個東東能幫我解決問題。
String array[]={"aa","bb","cc"};for (int i = 0; i < array.length; i++) {method(array[0]);//當然對于build來說,這里應該是target}二、開始使用
找到http://ant-contrib.sourceforge.net/,上面說得很清楚了,使用Ant-Contrib之前應該先安裝ant,而且Ant-Contrib 中的大部分task需要ant1.5或者更高版本。先看一下我的ant版本,我用得是Eclipse中集成的1.6.5ant,"Window→Preferences→Ant→Runtime",如下圖,在classpath中可以看到我的ant 版本是1.6.5。
?
先在網上下載一個ant-contrib-1.0b3.jar,我已經上傳到附件中,
然后在ant的build.xml中添加下面的代碼:
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE project [ <!ENTITY build-properties SYSTEM "build-properties.xml"> ]> <project name="DCI.XXX" basedir="." default="build-many-project"><!-- ============================================================== --><!-- Compile Settings --><!-- ============================================================== --><property name="build.debug" value="on" /><property name="build.debuglevel" value="lines,vars,source" /><property name="build.optimize" value="off" /><property name="build.deprecation" value="off" /><property name="build.source" value="1.4" /><property name="workspace.dir" location="../../../" /><property name="target.project.dir" location="../../" /><path id="ant.contrib.lib"><fileset dir="lib"><include name="**/*jar" /></fileset></path><taskdef resource="net/sf/antcontrib/antcontrib.properties"><classpath><path refid="ant.contrib.lib" /></classpath></taskdef><taskdef name="foreach" classname="net.sf.antcontrib.logic.ForEach"><classpath><path refid="ant.contrib.lib" /></classpath></taskdef><!-- ============================================================== --><!-- 循環構建每一個工程 --><!-- ============================================================== --><target name="build-many-project"><foreach target="build-one-project" param="projectName" list="cip;hnppb_bap" delimiter=";" /></target><!-- ============================================================== --><!-- 構建每一個工程 --><!-- ============================================================== --><target name="build-one-project"> <!--把java文件拷貝到src/java目錄--><copy todir="${target.project.dir}/src/java" overwrite="true"><fileset dir="${workspace.dir}/${projectName}/src/java"><include name="**/*" /></fileset></copy> </target> </project>?
上面的代碼可以看出,我只使用了foreach這個功能,還有if等別的功能,大家可以使用。
?
三、確實方便了很多,根據客戶配置的工程名,處理每個工程,但是后來又遇到一個問題,就是copy時,因為是把兩個或者多個工程合并到一個工程,我希望重名的文件能夠給出提示,讓用戶手工處理,ant 的copy? task太簡單了,只能配置是否覆蓋,所以我確定擴展ant,即自己定義task ,ant的架構設計得真是優秀,擴展起來太方便了,只需要建一個繼承了Task類的類,打包成jar后,在xml配置文件中使用 taskdef? 導入即可,具體來說就是以下幾步:
1、建一個工程:
????????
在Eclipse下的ant jar包拷到lib 下,設置build path, 這樣就不會報編譯錯誤。
2、構建BuildManyProject類
import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; public class BuildManyProject extends Task {public void execute() throws BuildException { System.out.println("俺會輸出來的"); } }3、打包為jar,將class文件拷到f盤,然后使用
cmd
?f: (進入f盤)
jar -cvf buildmatic.jar com\?? (打包為buildmatic.jar)
將buildmatic.jar拷貝到build.xml文件所以工程的lib目錄下
?
4、使用:在 build.xml中加入下面的代碼
?
<path id="ant.buildmatic.lib"><fileset dir="lib"><include name="**/buildmatic.jar" /></fileset> </path> <taskdef name="buildManyProject" classname="com.smartdor.bap.buildmatic.BuildManyProject"><classpath><path refid="ant.buildmatic.lib" /></classpath></taskdef> <buildManyProject/>OK,,運行的時候會出現:"俺會輸出來的"
?
總結:ant 里定義了一結構建工程常用的命令,例如copy、javac等,ant-contrib對ant的任務進行了擴展,提供了條件、循環判斷,但是如果有時候這些擴展還是不滿足我們的日常需求,那只能自己擴展了,有必要研究一下ant 架構的設計,看看怎么做到這么靈活的可插拔的,end.
總結
- 上一篇: bean的属性类型----ibatis类
- 下一篇: java全半角转换