| 知乎專欄 | 多維度架構 | | | 微信號 netkiller-ebook | | | QQ群:128659835 請註明“讀者” |
目錄
cd /usr/local/src wget http://mirror.bjtu.edu.cn/apache//ant/binaries/apache-ant-1.8.1-bin.tar.gz tar zxvf apache-ant-1.8.1-bin.tar.gz mv apache-ant-1.8.1 /usr/local/ cd .. ln -s apache-ant-1.8.1 apache-ant
ANT_HOME=/usr/local/apache-ant export CLASSPATH=$CLASSPATH:$ANT_HOME/lib
ant.project.name 一般式定義在
<project name="www.netkiller.cn" default="compile" basedir="." xmlns:if="ant:if">
<echo>${ant.project.name}</echo>
我們希望從命令行傳遞這個值
<project default="compile" basedir="." xmlns:if="ant:if">
<echo>${ant.project.name}</echo>
你需要將 project 中的定義去掉才能從命令行傳遞
ant -Dant.project.name=www.netkiller.cn -f build.xml
你也可以從 build.properties 檔案定義 ant.project.name
MacBook-Pro:deployment neo$ cat build.properties ant.project.name=www.netkiller.cn
ant -f build.xml -propertyfile build.properties
<description>project Name</description>
在 build.xml 中定義 property
<property name="src" value="src"/> <property name="dest" value="classes"/> <property name="hello" value="hello.jar"/>
引用 properties 檔案
<property file="build.properties" /> <propety resource="build.properties"/>
設置系統的環境變數為首碼
<property environment="env"/>
<property name="tomcat.home" value="${env.CATALINA_HOME}"/>
命令行傳值,使用-D參數是會覆蓋build.xml中的先前定義的變數
$ ant --help | grep property -D<property>=<value> use value for given property -propertyfile <name> load all properties from file with -D
定義
<path id="classpath">
<fileset dir="${env.JAVA_HOME}/lib">
<include name="*.jar" />
</fileset>
<fileset dir="${env.CATALINA_HOME}/lib">
<include name="*.jar" />
</fileset>
<fileset dir="WebRoot/WEB-INF/lib" includes="*.jar"/>
</path>
引用
<javac srcdir="${src.dir}" destdir="${classes.dir}" source="1.5" target="1.5">
<classpath refid="classpath" />
</javac>
<classpath>
<path refid="classpath"/>
</classpath>
複製目錄
<copy todir="${basedir}/WebContent">
<fileset dir="${basedir}/WebRoot" includes="**/*"/>
</copy>
複製指定副檔名檔案
<copy todir="${dest}">
<fileset dir="${src}">
<include name="**/*.xml" />
<include name="**/*.properties" />
</fileset>
</copy>
<path id="classpath">
<fileset dir="${env.JAVA_HOME}/lib">
<include name="*.jar" />
</fileset>
<fileset dir="${env.CATALINA_HOME}/lib">
<include name="*.jar" />
</fileset>
<fileset dir="${project.dir}/WebRoot/WEB-INF/lib" includes="*.jar" />
</path>
<javac srcdir="${project.src}" destdir="${project.build}/WEB-INF/classes" debug="true" listfiles="true">
<classpath refid="classpath" />
<include name="**/*.java"/>
<exclude name="**/*.xml"/>
<exclude name="**/*.properties"/>
</javac>
listfiles 顯示編譯檔案列表
debug 顯示調試信息,編譯錯誤信息
<?xml version="1.0"?>
<project name="test" default="doFoo" basedir=".">
<property name="directory" value="/www/directory"/>
<target name="doFoo" depends="dir.check" if="dir.exists">
<echo>${directory} exists</echo>
</target>
<target name="doBar" depends="dir.check" unless="dir.exists">
<echo>${directory} missing"</echo>
</target>
<target name="dir.check">
<condition property="dir.exists">
<available file="${directory}" type="dir"/>
</condition>
</target>
</project>
<project name="{{ name }}" default="help" basedir=".">
<property name="username" value="{{ username }}"/>
<property name="host" value="{{ host }}"/>
<property name="dir" value="/srv/{{ path }}/"/>
<tstamp>
<format property="TODAY_UK" pattern="yyyyMMddhhmmss" locale="en,UK"/>
</tstamp>
<target name="help" description="show available commands" >
<exec executable="ant" dir="." failonerror="true">
<arg value="-p"/>
</exec>
</target>
<target name="deploy-to" description="show where we are deploying to" >
<echo>${username}@${host}:${dir}</echo>
</target>
<target name="deploy" description="deploy usng rsync" >
<exec executable="rsync" dir="." failonerror="true">
<arg value="-r"/>
<arg value="."/>
<arg value="${username}@${host}:${dir}"/>
<arg value="--exclude-from=rsync.excludes"/>
<arg value="-v"/>
</exec>
</target>
<target name="deploy-test" description="test deploy usng rsync with the dry run flag set" >
<exec executable="rsync" dir="." failonerror="true">
<arg value="-r"/>
<arg value="."/>
<arg value="${username}@${host}:${dir}"/>
<arg value="--exclude-from=rsync.excludes"/>
<arg value="--dry-run"/>
<arg value="-v"/>
</exec>
</target>
<target name="backup" description="backup site" >
<exec executable="scp" dir="." failonerror="true">
<arg value="-r"/>
<arg value="${username}@${host}:${dir}"/>
<arg value="backups/${TODAY_UK}"/>
</exec>
</target>
</project>
<if>
<available file="my_directory" type="dir" />
<then>
<echo message="Directory exists" />
</then>
<else>
<echo message="Directory does not exist" />
</else>
</if>
Ant 1.9.x 新增 xmlns:if="ant:if"
<project name="tryit"
xmlns:if="ant:if"
xmlns:unless="ant:unless"
>
<exec executable="java">
<arg line="-X" if:true="${showextendedparams}"/>
<arg line="-version" unless:true="${showextendedparams}"/>
</exec>
<condition property="onmac">
<os family="mac"/>
</condition>
<echo if:set="onmac">running on MacOS</echo>
<echo unless:set="onmac">not running on MacOS</echo>
</project>
<!DOCTYPE project>
<project xmlns:if="ant:if" xmlns:unless="ant:unless">
<property unless:set="property" name="property.is.set" value="false"/>
<property if:set="property" name="property.is.set" value="true"/>
<echo>${property.is.set}</echo>
</project>
arg value 與 arg line
arg line 可以處理參數的空格, 而arg value則不能. arg line 可以處理空參數, arg value傳遞空參數會報錯.
<exec executable = "sh" dir = "@{dir}">
<arg line = "ls -l /var/log" />
</exec>
<exec executable = "ls" dir = "@{dir}">
<arg value = "-l" />
<arg value = "/var/log" />
</exec>
<macrodef name="mvn">
<attribute name="options" default="" />
<attribute name="goal" default="" />
<attribute name="phase" default=" " />
<attribute name="dir" default="" />
<element name="args" optional="false" />
<sequential>
<exec executable="mvn" dir="@{dir}" >
<arg value="@{options}" />
<arg value="@{goal}" />
<arg value="@{phase}" />
</exec>
</sequential>
</macrodef>
<!-- 執行下面宏將會出錯,你必須傳遞options,phase參數 -->
<mvn goal="package" dir="${project.dir}"/>
<!-- 將vale改為line後正常 -->
<exec executable="mvn" dir="@{dir}" >
<arg line="@{options}" />
<arg line="@{goal}" />
<arg line="@{phase}" />
</exec>
運行方式sequential為順序執行, parallel為並行執行。
<macrodef name = "git">
<attribute name = "command" />
<attribute name = "dir" default = "" />
<element name = "args" optional = "true" />
<sequential>
<echo message = "git @{command}" />
<exec executable = "git" dir = "@{dir}">
<arg value = "@{command}" />
<args/>
</exec>
</sequential>
</macrodef>
<macrodef name = "git-clone-pull">
<attribute name = "repository" />
<attribute name = "dest" />
<sequential>
<git command = "clone">
<args>
<arg value = "@{repository}" />
<arg value = "@{dest}" />
</args>
</git>
<git command = "pull" dir = "@{dest}" />
</sequential>
</macrodef>
<git command = "clone">
<args>
<arg value = "git://github.com/280north/ojunit.git" />
<arg value = "ojunit" />
</args>
</git>
<git command = "pull" dir = "repository_path" />
<git-clone-pull repository="git://github.com/280north/ojunit.git" dest="ojunit" />
<macrodef name="rsync">
<attribute name="option" default="auzv" />
<attribute name="src" default="" />
<attribute name="dest" default="" />
<element name="args" optional="true" />
<sequential>
<exec executable="rsync">
<arg value="@{option}" />
<arg value="@{src}" />
<arg value="@{dest}" />
<args />
</exec>
</sequential>
</macrodef>
<target name="deploy" depends="compile">
<rsync option="-auzv" src="${project.dest}" dest="${remote}:${destination}">
<args>
<arg value="-P" />
</args>
</rsync>
</target>
<macrodef name="ssh">
<attribute name="host" />
<attribute name="command" />
<attribute name="keyfile" default="~/.ssh/id_rsa" />
<element name="args" optional="true" />
<sequential>
<exec executable="ssh">
<arg value="@{host}" />
<!-- arg value="-i @{keyfile}" / -->
<args />
<arg value="@{command}" />
</exec>
</sequential>
</macrodef>
<target name="stop" depends="">
<!-- ssh host="${remote}" command="/srv/apache-tomcat/bin/catalina.sh stop -force" keyfile="~/.ssh/id_rsa" / -->
<ssh host="${remote}" command="/srv/apache-tomcat/bin/shutdown.sh" />
</target>
<target name="start" depends="">
<ssh host="${remote}" command="/srv/apache-tomcat/bin/startup.sh" keyfile="~/.ssh/id_rsa" />
</target>
<macrodef name="mvn">
<attribute name="options" default="" />
<attribute name="goal" default="" />
<attribute name="phase" default=" " />
<attribute name="dir" default="" />
<element name="args" optional="false" />
<sequential>
<exec executable="mvn" dir="@{dir}" >
<arg line="@{options}" />
<arg value="@{goal}" />
<arg line="@{phase}" />
</exec>
</sequential>
</macrodef>
$ cat build.xml
<project name="Attachments" default="print">
<property name="numAttachments" value="20" />
<target name="generate">
<script language="javascript"><![CDATA[
var list = '1';
var limit = project.getProperty( "numAttachments" );
for (var i=2;i<limit;i++)
{
list = list + ',' + i;
}
project.setNewProperty("list", list);
print(list);
]] >
</script>
</target>
</project>
$ ant generate Buildfile: /www/testing/build.xml generate: [script] 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 BUILD SUCCESSFUL Total time: 0 seconds
https://ant.apache.org/manual/Tasks/mail.html
cp ~/.m2/repository/com/sun/mail/javax.mail/1.5.6/javax.mail-1.5.6.jar /srv/apache-ant-1.9.6/lib cp /www/.m2/repository/com/sun/mail/javax.mail/1.5.6/javax.mail-1.5.6.jar /srv/apache-ant-1.10.1/lib/
Examples
<mail from="me"
tolist="you"
subject="Results of nightly build"
files="build.log"/>
Sends an email from me to you with a subject of Results of nightly build and includes the contents of the file build.log in the body of the message.
<mail mailhost="smtp.myisp.com" mailport="1025" subject="Test build">
<from address="config@myisp.com"/>
<replyto address="me@myisp.com"/>
<to address="all@xyz.com"/>
<message>The ${buildname} nightly build has completed</message>
<attachments>
<fileset dir="dist">
<include name="**/*.zip"/>
</fileset>
</attachments>
</mail>
<basename property="jar.filename" file="${lib.jarfile}"/>
will set jar.filename to myjar.jar, if lib.jarfile is defined as either a full-path filename (eg., /usr/local/lib/myjar.jar), a relative-path filename (eg., lib/myjar.jar), or a simple filename (eg., myjar.jar).
<basename property="cmdname" file="D:/usr/local/foo.exe"
suffix=".exe"/>
will set cmdname to foo.
<property environment="env"/>
<basename property="temp.dirname" file="${env.TEMP}"/>
includeantruntime="false"
<target name="compile" depends="init">
<javac includeantruntime="false" srcdir="${src}" destdir="${dest}"/>
</target>
or
<property name="build.sysclasspath" value="last"/>
將 executable="echo" 設置成 echo 是一種不錯的調試手段
<macrodef name="gulp">
<attribute name="stage" default=""/>
<attribute name="src" default=""/>
<attribute name="dir" default="" />
<sequential>
<exec vmlauncher="false" executable="echo" dir="@{dir}" osfamily="unix">
<arg line="--stage @{stage} --src @{src}"/>
<!-- arg value="stage @{stage}" / -->
</exec>
</sequential>
</macrodef>
<target name="gulp">
<gulp stage="${git.branch}" src="cn" dir="."/>
</target>