說(shuō)他無(wú)所不能,好像有點(diǎn)夸張,但是用過(guò)Ant之后,感覺(jué)真的是只有想不到?jīng)]有作不到.Ant,原作者選擇他作為軟件名字的意思是指"令一個(gè)簡(jiǎn)潔的工具"(Another Neat Tool),而這個(gè)真正的名字現在去很少為人所知
,但這絲毫不影響他成為最優(yōu)秀的構建工具.
現在開(kāi)始我將進(jìn)入一個(gè)"螞蟻"的世界,通過(guò)例子,真真正正去了解他!
文章參考資料可以到
http://www.manning.com/antbook去下載
Ant的最好學(xué)習資料<<使用Ant進(jìn)行Java開(kāi)發(fā)>>
Ant的官方網(wǎng)站:
http://ant.apache.org/Ant的最新版本:Ant 1.6.5
本文所有的例子運行的環(huán)境:JDK1.4.2,Ant1.6.2,eclipse3.0
一.使用Ant運行Java程序
我們先從簡(jiǎn)單的Hello學(xué)起,目錄結構如下
project--
|src--
| |--org.ant.chapter1.Hello
|bin
|build.xml
以后的例子大多采用此目錄結構,特例會(huì )額外聲明
build.xml文件
<?xml version="1.0"?>
<project name="project" default="run">
<target name="compile">
<javac destdir="bin" srcdir="src"></javac>
</target>
<target name="run" depends="compile">
<java classname="org.ant.chapter1.Hello">
</java>
</target>
</project>
從結構來(lái)看構建文件很簡(jiǎn)單,里面的內容大家也一定能夠看得懂,可以看出Ant的核心任務(wù)就是target,一個(gè)Ant文件有多個(gè)target組成,而這些target之間,又有相互的依賴(lài)關(guān)系--depends,運行的時(shí)候默認運行project中指定的target.
javac--編譯java文件 java--運行java文件
使用eclipse中集成的Ant運行build.xml文件(當然,也可以將ANT_HOME加到Path中,在命令行中運行)
Buildfile: D:\MyEclipse\workspace\sad\build.xml
compile:
run:
[java] Working directory ignored when same JVM is used.
[java] Could not find org.ant.chapter1.Hello. Make sure you have it in your classpath
[java] at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:166)
[java] at org.apache.tools.ant.taskdefs.Java.run(Java.java:705)
[java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:177)
[java] at org.apache.tools.ant.taskdefs.Java.execute(Java.java:83)
[java] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[java] at org.apache.tools.ant.Task.perform(Task.java:364)
[java] at org.apache.tools.ant.Target.execute(Target.java:341)
[java] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[java] at org.apache.tools.ant.Project.executeTarget(Project.java:1214)
[java] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:379)
[java] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:135)
BUILD SUCCESSFUL
Total time: 703 milliseconds
,java入門(mén)的經(jīng)典錯誤,ClassNotDefException,可見(jiàn)是classpath設置問(wèn)題,而觀(guān)察得到compile成功運行,所以我們在run-target里面加入classpath的配置
<?xml version="1.0"?>
<project name="project" default="run">
<target name="compile">
<javac destdir="bin" srcdir="src"></javac>
</target>
<target name="run" depends="compile">
<java classname="org.ant.chapter1.Hello">
<classpath path="bin"></classpath>
</java>
</target>
</project>
運行
Buildfile: D:\MyEclipse\workspace\sad\build.xml
compile:
run:
[java] Hello World!
BUILD SUCCESSFUL
Total time: 672 milliseconds
成功!!第一個(gè)Ant應用完成,有人會(huì )說(shuō):用IDE運行豈不是更簡(jiǎn)單,但是你要知道運行java程序只是Ant的一個(gè)小小的功能,后面我們會(huì )看到Ant的更強大的功能!
下一篇文章將介紹java程序運行的擴展及用Ant運行tomcat!
java程序運行的擴展
1.帶有參數的應用程序運行
Ant在<java>任務(wù)中提供了<arg>元素,<arg>有四種屬性value,file,line,path
public class Hello { public static void main(String[] args) {
System.out.println("Hello " + args[0]);
File file = new File(args[1]);
String[] filename = file.list();
for(int i = 0; i < filename.length; i++) {
System.out.println(filename[i]);
}
}
}
build.xml
<?xml version="1.0"?>
<project name="project" default="run">
<property name="run.classpath" value="bin"></property>
<target name="compile">
<javac destdir="bin" srcdir="src"></javac>
</target>
<target name="run" depends="compile">
<java classname="org.ant.chapter1.Hello">
<classpath path="${run.classpath}"></classpath>
<arg value="Ant"/>
<arg file="D:\rag"/>
</java>
</target>
</project>
Buildfile: D:\MyEclipse\workspace\sad\build.xml
compile:
run:
[java] Hello Ant
[java] hello.dat
BUILD SUCCESSFUL
Total time: 734 milliseconds
2.控制新的JVM
一般的<java>任務(wù)都運行在當前的JVM中,單一些特定的情況下將Ant運行在新的JVM下面,這時(shí)只需要將<java>中的一個(gè)屬性fork設置為true就可以了.
我們知道,java命令提供了許多的運行參數,用于指定JVM的屬性,同樣在A(yíng)nt也提供相應的屬性,看例子:
<?xml version="1.0"?>
<project name="project" default="run">
<property name="run.classpath" value="bin"></property>
<property name="Search.JVM.extra.args" value="-Xincgc"></property>
<target name="compile">
<javac destdir="bin" srcdir="src"></javac>
</target>
<target name="run" depends="compile">
<java classname="org.ant.chapter1.Hello" fork="true"
maxmemory="64m">
<classpath path="${run.classpath}"></classpath>
<jvmarg line="${Search.JVM.extra.args}"/>
<arg value="Ant"/>
<arg file="D:\rag"/>
</java>
</target>
</project>
3.運行jar文件,使用failonerror處理錯誤
<java>同樣提供了運行jar文件的屬性
MANIFEST.MF
Mainfest-Version: 1.0
Created-By: myth
Sealed: false
Main-Class: org.ant.chapter1.Hello
build.xml
<?xml version="1.0"?>
<project name="project" default="run">
<property name="run.classpath" value="bin"></property>
<property name="Search.JVM.extra.args" value="-Xincgc"></property>
<target name="compile">
<javac destdir="bin" srcdir="src"></javac>
</target>
<target name="jar" depends="compile">
<jar destfile="test.jar" update="true"
manifest="MANIFEST.MF">
<fileset dir="bin">
<include name="**/*.class"/>
</fileset>
</jar>
</target>
<target name="run" depends="jar">
<java fork="true" maxmemory="64m" jar="test.jar">
<classpath path="${run.classpath}"></classpath>
<jvmarg line="${Search.JVM.extra.args}"/>
<arg value="Ant"/>
<arg file="D:\rag"/>
</java>
</target>
</project>
Buildfile: D:\MyEclipse\workspace\sad\build.xml
compile:
jar:
[jar] Updating jar: D:\MyEclipse\workspace\sad\test.jar
run:
[java] Hello Ant
[java] hello.dat
BUILD SUCCESSFUL
Total time: 875 milliseconds
在某些情況下,我們不希望由于一些不重要的任務(wù)構建失敗,而導致整個(gè)構建的失敗,所以Ant提供了一個(gè)共同的屬性-failonerror,多數任務(wù)的默認值為failonerror="true",既當此任務(wù)構建失敗時(shí),失敗信息會(huì )傳遞給控制臺,并導致build failed,failonerror只支持在新的JVM里運行.
<target name="run" depends="jar">
<java fork="true" maxmemory="64m" jar="test.jar"
failonerror="false" >
<classpath path="${run.classpath}"></classpath>
<jvmarg line="${Search.JVM.extra.args}"/>
<arg value="Ant"/>
<arg file="D:\rag"/>
</java>
</target>
Buildfile: D:\MyEclipse\workspace\sad\build.xml
compile:
jar:
run:
[java] java.lang.NullPointerException
[java] at org.ant.chapter1.Hello.main(Hello.java:27)
[java] Hello Ant
[java] Exception in thread "main"
[java] Java Result: 1
BUILD SUCCESSFUL
Total time: 984 milliseconds
可以看出雖然run構建失敗,但是Ant還是執行了,原來(lái)的jar文件,并且BUILD SUCCESSFUL!!
使用Ant運行tomcat
Ant使用<exec>任務(wù)運行本地程序,先看一個(gè)例子:
<?xml version="1.0"?>
<project name="project" default="run">
<target name="run">
<exec executable="cmd">
<arg value="/C a.bat"/>
</exec>
</target>
</project>
a.bat
@echo off
echo Hello >> a.txt
運行完后,會(huì )在根目錄生成a.txt文件,里面內容為Hello
下面我們來(lái)運行tomcat
<?xml version="1.0"?>
<project name="project" default="tomcat-start">
<property name="tomcat.dir" value="c:/Tomcat5"></property>
<target name="tomcat-start">
<exec dir="${tomcat.dir}/bin" executable="cmd">
<env key="CATALINA_HOME" path="${tomcat.dir}"/>
<arg value="/C startup.bat"/>
</exec>
</target> <target name="tomcat-stop">
<exec dir="${tomcat.dir}/bin" executable="cmd">
<env key="CATALINA_HOME" path="${tomcat.dir}"/>
<arg value="/c shutdown.bat"/>
</exec>
</target>
</project>
四.使用Ant進(jìn)行Junit測試
我們除了使用java來(lái)直接運行junit之外,我們還可以使用junit提供的junit task與ant結合來(lái)運行。涉及的幾個(gè)主要的ant task如下:
l <junit>,定義一個(gè)junit task
l <batchtest>,位于<junit>中,運行多個(gè)TestCase
l <test>,位于<junit>中,運行單個(gè)TestCase
l <formatter>,位于<junit>中,定義一個(gè)測試結果輸出格式
l <junitreport>,定義一個(gè)junitreport task
l <report>,位于<junitreport>中,輸出一個(gè)junit report
運行Junit需要jakarta-ant-1.4-optional.jar和Junit.jar包,因為這兩個(gè)包用于支持ant task--<junit>的,所以不能在build.xml文件中加載,需要將他們放到ANT_HOME中去.使用eclipse可以按照一下步驟加入:
Windows-Preference-Ant-Runtime-Ant Home Entries
下面看一個(gè)Junit測試的例子:
<?xml version="1.0"?>
<project name="project" default="junit">
<property name="run.classpath" value="bin"></property>
<property name="run.srcpath" value="src"></property>
<property name="test.srcpath" value="test"></property>
<property name="lib.dir" value="lib"/>
<path id="compile.path">
<pathelement location="${lib.dir}/junit-3.8.1.jar"/>
<pathelement location="${lib.dir}/log4j-1.2.8.jar"/>
</path>
<target name="compile">
<javac destdir="${run.classpath}" srcdir="${run.srcpath}"
classpathref="compile.path"/>
<javac destdir="${run.classpath}" srcdir="${test.srcpath}"
classpathref="compile.path"/>
</target>
<target name="junit" depends="compile">
<junit printsummary="true">
<classpath path="${run.classpath}"></classpath>
<test name="org.ant.test.Test1"></test>
</junit>
</target>
</project>
可以看出Junit的使用基本和java差不多, printsummary允許輸出junit信息,當然Ant提供formatter屬性支持多樣化的junit信息輸出.Ant包含三種形式的formatter:
brief:以文本格式提供測試失敗的詳細內容;
plain:以文本格式提供測試失敗的詳細內容以及每個(gè)測試的運行統計;
xml:以xml格式提供擴展的詳細內容,包括正在測試時(shí)的Ant特性,系統輸出,以及每個(gè)測試用 例的系統錯誤.
使用formatter時(shí)建議將printsummary關(guān)閉,因為他可能對formatter的生成結果產(chǎn)生影響,并多生成一份同樣的輸出.當然我們可以使用formatter將輸出結果顯示在console中:
<formatter type="brief" usefile="false"/>
Junit支持多個(gè)formatter同時(shí)存在:
<formatter type="brief" usefile="false"/>
<formatter type="xml"/>
使用xml我們可以得到擴展性更強的信息輸出,這時(shí)在<test>中要設定todir來(lái)指定xml的輸出路徑.
在通常情況下我們不可能一個(gè)一個(gè)來(lái)處理junit,所以Ant提供了<batchtest>,可以在他里面嵌套文件集(fileset)以包含全部的測試用例.
對于大量的用例,使用控制臺輸出,或者使用文件或xml文件來(lái)作為測試結果都是不合適的,Ant提供了<junitreport>任務(wù)使用XSLT將xml文件轉換為HTML報告.該任務(wù)首先將生成的XML文件整合成單一的XML文件,然后再對他進(jìn)行轉換,這個(gè)整合的文件默認情況下被命名為:TESTS-TestSuites.xml.
<junitreport todir="${test.xml}">
<fileset dir="${test.xml}">
<include name="TEST-*.xml"/>
</fileset>
<report format="frames" todir="${test.report}"/>
</junitreport>
<report>元素指示轉換過(guò)程中生成有框架(frames)或者無(wú)框架的類(lèi)似與javadoc格式的文件,并保存到todir所在的目錄下面.(由于xalan對于JDK1.4以上的版本存在問(wèn)題,所以要生成HTML文件需要以下步驟:現在最新的xalan,在%JAVA_HOME%/jre/lib中建立文件夾endorsed.將xalan中的jar文件copy到里面).
下面看一個(gè)完整的例子:
<?xml version="1.0"?>
<project name="project" default="junit">
<property name="run.classpath" value="bin"></property>
<property name="run.srcpath" value="src"></property>
<property name="test.srcpath" value="test"></property>
<property name="test.xml" value="xml"></property>
<property name="test.report" value="report"></property>
<property name="lib.dir" value="lib"/>
<path id="compile.path">
<pathelement location="${lib.dir}/junit-3.8.1.jar"/>
<pathelement location="${lib.dir}/log4j-1.2.8.jar"/>
</path>
<target name="init">
<delete dir="${test.report}"/>
<mkdir dir="${test.report}"/>
<delete dir="${test.xml}"/>
<mkdir dir="${test.xml}"/>
</target>
<target name="compile" depends="init">
<javac destdir="${run.classpath}" srcdir="${run.srcpath}"
classpathref="compile.path"/>
<javac destdir="${run.classpath}" srcdir="${test.srcpath}"
classpathref="compile.path"/>
</target>
<target name="junit" depends="compile">
<junit printsummary="false">
<classpath path="${run.classpath}"></classpath>
<formatter type="xml"/>
<batchtest todir="${test.xml}">
<fileset dir="${run.classpath}">
<include name="**/Test*.class"/>
</fileset>
</batchtest>
</junit>
<junitreport todir="${test.xml}">
<fileset dir="${test.xml}">
<include name="TEST-*.xml"/>
</fileset>
<report format="frames" todir="${test.report}"/>
</junitreport>
</target>
</project>
<?xml version="1.0"?>
<project name="project" default="junit">
<property name="run.classpath" value="bin"></property>
<property name="run.srcpath" value="src"></property>
<property name="test.srcpath" value="test"></property>
<property name="test.xml" value="xml"></property>
<property name="test.report" value="report"></property>
<property name="lib.dir" value="lib"/>
<path id="compile.path">
<pathelement location="${lib.dir}/junit-3.8.1.jar"/>
<pathelement location="${lib.dir}/log4j-1.2.8.jar"/>
</path>
<target name="init">
<delete dir="${test.report}"/>
<mkdir dir="${test.report}"/>
<delete dir="${test.xml}"/>
<mkdir dir="${test.xml}"/>
</target>
<target name="compile" depends="init">
<javac destdir="${run.classpath}" srcdir="${run.srcpath}"
classpathref="compile.path"/>
<javac destdir="${run.classpath}" srcdir="${test.srcpath}"
classpathref="compile.path"/>
</target>
<target name="junit" depends="compile">
<junit printsummary="false">
<classpath path="${run.classpath}"></classpath>
<formatter type="xml"/>
<batchtest todir="${test.xml}">
<fileset dir="${run.classpath}">
<include name="**/Test*.class"/>
</fileset>
</batchtest>
</junit>
<junitreport todir="${test.xml}">
<fileset dir="${test.xml}">
<include name="TEST-*.xml"/>
</fileset>
<report format="frames" todir="${test.report}"/>
</junitreport>
</target>
</project>
生成的文檔:
點(diǎn)擊Properties超鏈接會(huì )彈出一個(gè)窗口顯示在測試運行時(shí)全部的Ant特性,這對于跟蹤由環(huán)境和配置造成的失敗是非常便利的!
五.使用Ant運行本地程序
1.使用Ant運行windows的批處理文件
要在A(yíng)nt內運行一個(gè)外部程序,應使用<exec>任務(wù).它允許你執行下列操作:
l 指定程序名和要傳入的參數.
l 命名運行目錄.
l 使用failonerror標志來(lái)控制當應用程序失敗時(shí)是否停止構建.
l 指定一個(gè)最大程序持續時(shí)間,時(shí)間超過(guò)則中止程序.任務(wù)在這時(shí)被認為是失敗,但是至少構建會(huì )中止,而不是掛起,這對于自動(dòng)構建是至關(guān)重要的.
l 將輸出存到一個(gè)文件或特性.
l 指定java調用本地程序時(shí)需要預先設定的環(huán)境變量.
下面來(lái)看一個(gè)例子:
批處理文件:
Test.bat
@echo off
echo Hello > test.txt
build.xml
<?xml version="1.0"?>
<project name="batch" default="extract" basedir=".">
<target name="extract">
<exec executable ="cmd">
<arg line="/c a.bat"/>
</exec>
</target>
</project>
使用executable元素標記指定使用的命令,具體用法可以在命令行下面輸入help cmd查看.如果你希望在運行批處理發(fā)生錯誤時(shí)中止構建需要設定failonerror="on".加入你的外部程序在某個(gè)時(shí)刻掛起,也許是在與遠程站點(diǎn)對話(huà),而你不希望構建永遠被掛起,Ant提供了timeout這個(gè)屬性,他是一個(gè)以毫秒為單位的數字.下面看一下如何使用Ant來(lái)運行tomcat.
啟動(dòng)tomcat需要兩個(gè)環(huán)境變量CATALINA_HOME, JAVA_HOME,如果你在環(huán)境變量中已經(jīng)設定,在A(yíng)nt中就不需要進(jìn)行處理,如果沒(méi)有需要使用<env>屬性來(lái)設定,你也可以使用<env>屬性覆蓋你以前的環(huán)境變量.
<?xml version="1.0"?>
<project name="batch" default="tomcat-start" basedir=".">
<property name="tomcat.dir" value="C:\Tomcat5"></property>
<target name="tomcat-start">
<exec dir="${tomcat.dir}/bin" executable="cmd">
<env key="CATALINA_HOME" path="${tomcat.dir}"/>
<arg value="/C startup.bat"/>
</exec>
</target>
</project>
2.使用Ant運行shell文件
由于windowsXP的cmd默認沒(méi)有安裝ps,bash等命令,所以我們需要借助的三方的軟件來(lái)實(shí)現這個(gè)功能,這里使用cgywin,將cgywin的bin目錄加到環(huán)境變量的Path里面(下面使用Ant運行cvs也會(huì )用到).
<?xml version="1.0"?>
<project name="batch" default="shell" basedir=".">
<property name="tomcat.dir" value="C:\Tomcat5"></property>
<target name="shell">
<exec dir="${tomcat.dir}/bin" executable="bash">
<env key="CATALINA_HOME" path="${tomcat.dir}"/>
<arg value="startup.sh"/>
</exec>
</target>
</project>
3.使用Ant運行cvs
Ant內置cvs屬性,可以很方便的使用cvs:
<?xml version="1.0"?>
<project name="batch" default="shell" basedir=".">
<property name="cvs.root" value="..."></property>
<target name="cvs">
<cvs cvsroot="cvs.root" command="checkout ../.."/>
</target>
</project>
如果你的Documents and Settings中有.cvspass文件,那么可以不用設定cvsroot,Ant會(huì )自動(dòng)尋找.
六.工程的打包部署
工程的打包,主要就是文件的操作,下面通過(guò)例子簡(jiǎn)單介紹一下文件的移動(dòng),復制和刪除.
<?xml version="1.0"?>
<project name="project" default="jar">
<target name="copy">
<tstamp>
<format property="time.format" pattern="yyyy-mm-dd‘T‘HH:mm:ss"
locale="en"/>
</tstamp>
<copy tofile="dist/readme" file="test.txt">
<filterset>
<filter token="TIME" value="${time.format}"/>
</filterset>
</copy>
</target>
<target name="move">
<move todir="dist">
<fileset dir="lib">
<include name="*.jar"/>
</fileset>
</move>
</target>
<target name="delete" depends="copy,move">
<delete verbose="true" failonerror="false">
<fileset dir="dist">
<include name="*.jar"/>
</fileset>
</delete>
</target>
</project>
需要說(shuō)明的是文件刪除的時(shí)候可能這個(gè)文件正在被別人是用而無(wú)法刪除,所以要用failonerror來(lái)標記,文件的復制是時(shí)間戳敏感的,如果拷貝的文件比原文件要老,那么Ant將不會(huì )執行copy,解決的辦法是將overwrite屬性設置為true,由于移動(dòng)文件是復制文件的一個(gè)子類(lèi),所以它們的原理基本相同.
前面已經(jīng)例舉過(guò)一個(gè)jar文件打包的例子,下面主要介紹war文件的打包.Ant提供war文件打包的屬性.<war>任務(wù)是<jar>任務(wù)的子類(lèi),但是他也提供了一些特有的屬性:
<target name="deploy" depends="init">
<war destfile="${war.dir}/spring.war" webxml="${web.dir}/web.xml" >
<classes dir="${web.dir}/classes"></classes>
<fileset dir="WebContent" excludes="web.xml"></fileset>
<lib dir="${web.dir}/lib"></lib>
</war>
</target>
可以看出war任務(wù)提供了許多WEB應用程序的特有屬性,只要你指定了這些文件,war任務(wù)就會(huì )自動(dòng)將他們放到正確的位置.
部署是項目發(fā)布的過(guò)程,Ant支持FTP,Email,本地和遠程等幾種部署模式,但是Ant并不內置對一些部署的支持,需要第三方的庫.
optional.jar 也可能是這樣的名字: jakarta-ant-1.4.1.optional.jar
netcomponents.jar <ftp>和<telnet>需要
activation.jar <mail>需要
mail.jar <mail>需要
下面只以本地部署為例,服務(wù)器為tomcat.
由于tomcat支持熱部署,可以將webapp文件下的war文件自解壓縮,所以最簡(jiǎn)單的部署方式是將工程打成war包后直接copy到webapp目錄下面.另一種方法是使用tomcat的管理員身份,在manager頁(yè)面裝載和刪除應用,這種方法比較復雜,也比較正規,他也是遠程部署的基礎.
<?xml version="1.0"?>
<project name="project" default="deploy-local-catalina">
<property name="war.dir" value="dist"></property>
<property name="web.dir" value="WebContent/WEB-INF"></property>
<property name="webapp.name" value="spring"></property>
<property name="catalina.port" value="8080"></property>
<property name="catalina.username" value="admin"></property>
<property name="catalina.password" value="admin"></property>
<target name="init">
<mkdir dir="${war.dir}"/>
</target>
<target name="mkwar" depends="init">
<war destfile="${war.dir}/spring.war" webxml="${web.dir}/web.xml" >
<classes dir="${web.dir}/classes"></classes>
<fileset dir="WebContent" excludes="web.xml"></fileset>
<lib dir="${web.dir}/lib"></lib>
</war>
</target>
<target name="remove-local-catalina">
<property name="deploy.local.remove.url"
value="http://localhost:${catalina.port}/manager/remove"></property>
<get dest="deploy.local.remove.txt"
src="${deploy.local.remove.url}?path=/${webapp.name}"
username="admin" password="admin"/>
<loadfile property="depoly.local.remove.result"
srcfile="depoly.local.remove.txt"></loadfile>
</target>
<target name="deploy-local-catalina" depends="mkwar, remove-local-catalina">
<property name="deploy.local.urlpath"
value="file:///D:\MyEclipse\workspace\springstruts\dist\spring.war"></property>
<property name="deploy.local.url.params"
value="path=/${webapp.name}&war=${deploy.local.urlpath}"></property>
<property name="deploy.local.url"
value="http://localhost:${catalina.port}/manager/install"></property>
<get src="${deploy.local.url}?${deploy.local.url.params}"
dest="deploy-local.txt"
username="admin"
password="admin"/>
<loadfile property="deploy.local.result"
srcfile="deploy-local.txt"></loadfile>
</target>
</project>
可以看出只要將上面的localhost換成目標的ip地址就可以實(shí)現tomcat的遠程部署.
終于完成了Ant初級的學(xué)習筆記,感覺(jué)到后來(lái)沒(méi)有什么動(dòng)力,越寫(xiě)越亂,很多地方解釋的不清楚,只是給出build文件,然后就一筆帶過(guò),在以后的高級篇中,我會(huì )更加努力的!!