知乎專欄 | 多維度架構 | | | 微信號 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>