??xml version="1.0" encoding="utf-8" standalone="yes"?> <html:link> 标签有以下重要属性: <html:rewrite> 用于输出链接中的URI部分Q但它ƈ不生成HTML <a> 元素。URI指的是URL 中协议、主机和端口以后的内宏VURI 用于指定具体的请求资源。例如,对于URLQHTTPQ?/localhost:8080/HtmlBasic.doQ它的URI?HtmlBasic.do CZQ?br />1、创建全局转发链接 2、创建具有完整URL 的链?br /> 如果Web 应用需要链接到其他站点Q应该给出其他站点完_QԌQ例如: 3、从当前|页中创建相对URL 4、在URL ?URI 中包含请求参?br /> 如果要在URL或URI 中包含请求参敎ͼ只要把请求参数加在URL ?URI的末ְ可以了。例如: 提示Q在HTML ?amp;amp 代表Ҏ字符 "&" 5、在URL ?URI 中包含单个请求变?br /> rewrite: <html:rewrite page="/HtmlBasic.do" <html:link> 标签?paramId 属性指定请求参数名QparamName 属性指定变量的名字。如果变量ؓJavaBean Q用paramProperty 属性指定JavaBean 的属性?br /> 对于本例的stringBeanQ请求参数gؓstringBean 的字W串倹{对于customerBeanQ指定了paramProperty 属性,h参数gؓcustomerBean ?name 属性倹{?br /> 以上代码生成如下HTML 内容Q?br /> <a href="/HtmlBasic.do?urlParamName=Value to Pass on Url"> <a href="/HtmlBasic.do?urlParamName=weiqin"> rewrite: /HtmlBasic.do?urlParamName=Value to Pass on Url <html:link> 标签的name 属性指定包含请求变量的HashMap 对象。HashMap 对象中的每一?key/value" 代表一Ҏ多对"h参数?h参数?。以上代码生成如下的Html 内容Q?br /> <a href="/HtmlBasic.do?myString=myStringValue&myArray=str1&myArray=str2&myArray=str3"> 下面是关于ant介的一文章,可以只看build.xml相关的部分?/p> 我的教训Q在path中不能有I格。希望你不要犯这L错误?) 《我喜欢单:ant - java 构徏工具?/p> 作者:陈鹏 hello ant 理你的代码Qdoc文g,~译,配置{开发工作你是怎末做的Q自q理源目录Q编译文Ӟcopy,实施... q中间每ơ修攚w要经q重复的无数ơ手工copy,paste...q程Q好累,好花旉。可我确实不惛_ 如果你和我一样希望自动执行预定义的动作却又不惛_累,那末Q我觉得ANT工具不错Q?br />它可以以相同的用法用在不同^?跨^?。它是JAVA做的Q免费的Q开源的Q据说网上已l成了事实的JAVA 我花?天时间才掌握了它的基本用法,我希望你能通过我的文章和试验花半天旉掌握它?/p> 内容Q?/p> 下蝲Q安? 解压后ant_home用来方便讉K。ƈ保你也讄了java_home ?br /> set ant_home=D:\java\kit\ant\jakarta-ant-1.5.1 q是我的目录 p些,单吧?/p> hello ant 我们要开发一个javac:其内容只有一句,输出"hello ant"字符丌Ӏƈ使用ant完成~译和运行工作,q个例子只是Z跑通antQ不附加多余的东ѝ?/p> 下图为文件组l,请徏立相应的目录Qƈ~写HelloAnt.java 按照人家老外的文件组l规则咱也照搬?/p> 下面是:“hello.ant.HelloAnt.java”文件? public class HelloAnt{ 在项目根目录(hello-ant\)?个文Ӟant执行配置文gbuild.xml q是Q“build.xml”文?br />S2++++++++++++++++++++++++++++++++++++++++++++++++ <!-- 一个项?可包含很多Q务组(target) --> <!-- 目中的一个Q务组,可包含很多Q?task:javac,java...) --> <!--~译--> <!--q行--> </target> E2++++++++++++++++++++++++++++++++++++++++++++++++ dos下进入hello-ant的目录,即build.xml所在的目录Q我们要用ant工具执行?Q? 执行: %ant_home%/bin/ant -file build.xml 用ant工具执行当前目录下的配置文gbuild.xml 或?Qant -file build.xml 你如果设|?ant_home%/bin到path?/p> q次ok了,q是{案Q?/p> 命o提示W窗?/font> main: BUILD SUCCESSFUL hello ant q (此段比较废话Q可以略q? 我们要改qbuild.xmlQ让它做更多的事情: 定义全局变量 我们要扩充目录结构,使它更像回事Q?/p> ant处理~译之前的目录: ant处理之后的目录: 图中Q\src,\docs,\lib是自ql的文gl构Q\build,\dist是ant动态生成的成品?/p> \src 源文Ӟjava源,script源,jsp源,xml配置..... \docs 手写说明文档 \build 用ant动态生成的构徏目录 \dist\bin copy "\src\script" 得执行文?br />\dist\docs copy "\build\docs" 的文?br />\dist\lib 除了copy "\build\lib"下的hello-ant.jar外, 以上是我学老外的文件组l,大家可以按照自己的爱好组l?/p> 我们~写必要的文Ӟ hello.ant. HelloAnt.java 已有 \src\script.bat %java_home%\bin\java -classpath ..\lib\hello-ant.jar hello.ant.HelloAnt pause 讉Kapi文档 参照ant的jakarta-ant-1.6alpha的build.xml Copyright (c) 2002 The Neusoft Software Foundation. All rights ======================================================================= <!-- <target name="1"> dl?tasks) <target name="2"> project代表一个项目, <!-- <!--主要的系l环境属?-> <!--主要的app环境属?-> <!--app用到的lib--> <!--app的build目录?-> <!--app的dist (distribution) 目录?-> <!--app的docs目录?-> <!-- <!-- <!--准备目录--> <mkdir dir="${dist.dir}"/> </target> <!-- <!-- <!-- <javadoc packagenames="hello.ant.*" <!-- </target> </project> E4++++++++++++++++++++++++++++++++++++++++++++++ build.xml多了些,但其实很单:(注释比较详细可以参照Q这里再单说一? 一个build.xml包含一个工E的自动化处理的完整xml说明Qƈ且基本由3U东东组成: <project > 1.全局变量的定?br /> <property/> 2.dl?br /> <target> </project> 参考及下蝲Q?/p> ant最C载: ant具体的编写方法参考ant手册以下2部分ŞQ?br />http://jakarta.apache.org/ant/manual/using 使用说明 huihoo.com译改编的ant/manual/using 用ANT构造Application作者:余斌斌 ? ibm 利用 Ant ?JUnit q行增量开发——用单元测试来逐步改进代码 关于作者: 陈鹏Q东软西安公司。作Z名狂热的E序员希望每一天都能成长进步,q希望与大家分n快乐和知识?br />L以下方式和他联系Qemail chen56@msn.com 一、徏立Web应用步骤 <!-- ======================================================================= <property name="file.war" value="myapp.war"/> <property name="dir.src" value="src"/> <property name="vss.login" value="userId,password"/> <property name="server.ftp.userId" value="ftpuser"/> <path id="project.class.path"> <fileset dir="${dir.lib}"> <target name="clean"> <target name="getFromVcm" depends="init"> <vssget localPath="${dir.lib}" <target name="compile" depends="getFromVcm"> <target name="buildWar" depends="compile"> <target name="deploy" depends="buildWar"> <target name="main" description="" depends="deploy"/> </project>
(1) 允许在URL 中以多种方式包含h参数?br />(2) 当用h览器关闭Cookie Ӟ会自动重写URLQ把SessionID 作ؓh参数包含在URL 中,用于跟踪用户的Session 状态?/p>
(1) forwardQ指定全局转发链接?br />(2) hrefQ指定完整的URL 键接?br />(3) pageQ指定相对于当前|页的URL?/p>
首先Q在Struts-config.xml ?lt;global-forwards> 元素中定义一?lt;forward> 元素Q?br /> <global-forwards>
<forward name = "index" path="/index.jsp"/>
</global-forwards>
接着Q在JSP 文g中创?lt;html:link> 标签Q?br /> <html:link forward="index">
Link to Global ActionForward
</html:link>
<html:link> 标签的forward 属性和<global-forwards> 元素中的<forward> 子元素匹配。以上代码生成如下HTML 内容Q?br /> <a href="/index.jsp">Link to Global ActionFoward</a>
值得注意的是Q?lt;html:link> 的forward 属性只引用Struts-config.xml 配置文g?lt;global-forwards>内的<forward> 子元素,如果引用<action> 内的<forward> 子元素,在运行时会抛出异常Q?br /> Cannot create rewrite URL: Java.Net.MalfomedURlException: Cannot retrieve ActionForward
<html:link href=" Generate an "href" directly
</html:link>
生成HTML 代码如下Q?br /> <a href=" an "href" directly</a>
值得注意的是Q如果指定了<html:link> 标签的href 属性,即用户览器的Cookie 关闭Q?lt;html:link> 标签也不会把用户SessionID 作ؓh参数加和到URL 中?/p>
如果从一个网链接到同一个应用中的另一|页Q可以采用以下方式:
<html:link page="/HtmlBasic.do">
A relative link from this page
</html:link>
<html:link> 标签?page 属性用于指定相对于当前应用的URI。以上代码生成如下HTML 内容Q?br /> <a href="/lib/HtmlBasic.do">......</a>
<html:link page="/HtmlBasic.do?prop1=abc&prop2=123">
Hard-code the url parameters
</html:link>
<!-- or -->
<html:rewrite page="/HtmlBasic.do?prop1=abc&prop2=123"/>
以上代码生成如下HTML 内容Q?br /> <a href=/lib/HtmlBasic.do?prop1=abc&prop2=123">......</a>
rewrite: /HtmlBasic.do?prop1=abc&prop2=123
如果要在URL 中包含一个请求参敎ͼ而这人参数的值存在于当前|页可访问的一个变量中Q可以按以下Ҏ来实现?br /> Z演示q一功能Q首先创Z个当前网可讉K的变量。例如,本例中创Z两个变量Q一个是字符cdQ一个是CustomerBean Q?它们存存于一?page 范围内:
<%
/*
* Create a string object to store as a bean in
* the page content and embed in this link
*/
String stringBean = "Value to Pass ont URL";
pageContext.setAttribute("stringBean", stringBean);
%>
<jsp:useBean id = "customerBean" scope="page" class="htmltaglibs.beans.CurstomerBean"/>
<jsp:setProperty name="customerBean" property="name" value="weiqin"/>
接着Q把q两个变量作求参敎ͼ加入到URL或URI 中:
<html:link page="/HtmlBasic.do"
paramId="urlParamName"
paramName="stringBean">
URL encode a parameter based on a string bean value
</html:link>
<html:link page="/HtmlBasic.do"
paramId="urlParamName"
paramName="customerBean"
paramProperty="name">
URL encode a parameter based on a customer bean value
</html:link>
paramId="urlParamName" paramName="stringBean"/>
rewrite: <html:rewrite page="/HtmlBasic.do"
paramId="urlParamName" paramName="customerBean"
paramProperty="name"/>
Url encode a paramter based on a string bean value
</a>
url encode a parameter based on a customer bean value
</a>
rewrite: /HtmlBasic.do?urlParamName=weiqin
6、在URL ?URI 中包含多个请求变?br /> 如果在URL ?URI 中包含多个请求参敎ͼ而这些参数的值来自多个变量,需要先定义一个Mapcd的java c,如java.util.HashMapQ用它来存放h变量。例如:
<%
/*
* Strore values int a Map(HashMap in this case)
* and construct the URL based on the Map
* /
java.util.HashMap myMap = new java.util.HashMap();
myMap.put("myString", new String("myStringValue"));
myMap.put("myArray" , new String[]{"str1","str2","str3"} );
pageContext.setAttribute("map", myMap);
%>
在以上代码的HaspMap 中存放了两个对象Q其中第二个对象是个字符串数l。HashMap 被存攑֜PageContext 中?接下来就可以把这个HashMap 作ؓh参数Q加入到URL ?URI 中:
<%-- For this version of the <html:link> tag: --%>
<%-- map = a map with name/value pairs to pass on the url --%>
<html:link page="/HtmlBasic.do" name="map">
URL encode a parameter based on value in a Map
</html:link>
<%-- Create the same rewrite string for the above link. --%>
rewrite:<html:rewrite page="/HtmlBasic.do" name="map"/>
URL encode a parameter based on value in a Map
</a>
rewrite:/HtmlBasic.do?myString=myStringValue&myArray=str1&myArray=str2&myArray=str3
]]>
在window写bat,在unix写shellQ?br /> 可惜我不怎末会写。所以我制作一个ejb的过E是q样的:
写代?>写个bat~译代码->l织文g(ejb-jar.xml,jboss.xml...)->压羃文g生成jar文档->
实施......(q有同样的测试过E?(为甚末不用jbuild?)
学脚本编写,unix,linux下我q得重学Q太累?/p>
构徏标准Q还听说高手都用?..... ^_^
hello ant
hello ant q
参考及下蝲
下蝲Q安?br /> 又下?又是一大堆参数变量? :(
http://jakarta.apache.org/ant/index.html 它是apache的java子项?jakarta"的子目.你可以选择
当前的版本,目前我是1.5?window版,以下q它讲?/p>
S1++++++++++++++++++++++++++++++++++++++++++++++++
package hello.ant;
public static void main(String[] args){
System.out.println("hello ant,ant 的第一ơ接触,好棒Q?);
}
}
E1++++++++++++++++++++++++++++++++++++++++++++++++
<?xml version="1.0" encoding="GB2312" ?>
<project default="main" basedir=".">
<target name="main">
<javac srcdir="src\main\hello\ant" destdir="build\classes"/>
<java classname="hello.ant.HelloAnt">
<classpath>
<pathelement path="build\classes"/>
</classpath>
</java>
</project>
ok,一切大功告成,哦,不,q没有运行它?/p>
D:\temp\hello-ant>ant -file build.xml
Buildfile: build.xml
[javac] Compiling 1 source file to D:\temp\hello-ant\build\classes
[java] hello ant,ant 的第一ơ接触,好棒Q?/font>
Total time: 2 seconds
D:\temp\hello-ant>
查一下build/classes目录Q哦Q看到编译过的文件就在这?
build/classes/hello/ant/HelloAnt.class.
你也怼_q末单的工作写个批处理不得了,又xml又ant的,把我的时间都费完了Q我用jbuild?br />webShpere不就得了Q怎末说你才明白呢Q反正网上开源项目大多数都用ant,你M能给人家?.jpx吧,
而且q样的工具太贵,受不?当然用D的兄弟不怕^_^ )Q而且ant可以让你明确的管理和自动化所有的东西:
~译-实施-试...,哎,E微ȝ一点点Q但节约你以前花在零的copy,paste上的旉.而且我发现管?br />代码的质量有所提高.
初始?主要是徏立目?
~译 (已有)
打包为jar
建立API documentation
生成distribution产品
凡事都讲I^衡,你要antl你做更多事Q当然要累一点点Q不q只用篏一ơ,以后的代码修改后的构建都?一键式"完成,我们制作一个hello的简单例子,你可以自己做j2ee的练习?/p>
\src\main java?br />\src\script window,unix,liunx的执行scriptQ我们的单只有一个:
run.bat: java hello.ant.HelloAnt
\lib E序所需cd的jar,比如j2ee.jar,mail,jar...
\build\classes ~译的类文g
\build\docs copy "\docs"的手写说明文档,和ant生成的api文档
\build\lib 攄我们自己的HelloAnt.class打包成品hello-ant.jar
q应copy "\lib"的程序所需jarQ这里我们没有?/p>
S3+++++++++++++++++++++++++++++++++++++++++++++++
@echo off
echo ========================================================
echo 请先讄 Environment
echo .
echo JAVA_HOME: %JAVA_HOME%
echo ======================================================
E3+++++++++++++++++++++++++++++++++++
\docs\index.html 随便写一个手写的文档
hello ant 软g目手册docs
--------------------------------------------------------------------------------
\build.xml 配置文g
S4++++++++++++++++++++++++++++++++++++++++++++++++
<?xml version="1.0" encoding="GB2312" ?>
<!--
=======================================================================
hello-ant 目 ,学习ant工具的第2个build file.
reserved.
-->
文档l构?
<project>
<property/> 全局变量的定?br /> <property/>...
<javac></javac> 一javacd
...
<oneTask></ontTask> 一其它Q?br /> </target>
<javac></javac>
...
<oneTask></ontTask>
</target>
</project>
default:q行到名UCؓ"dist"的target(dl?
basedir:基准路径?br />-->
<project default="dist" basedir=".">
===================================================================
定义属性(property tasksQ?br /> 最好把用到的\径呀Q名U呀都在q里定义成全局变量
例:定义
<property name="a" value="hello"/>
以后可以这L它:
<property name="b" value="${a}/b"/>
现在:b=="hello/b"
===================================================================
-->
<property environment="env"/><!--取window,unix...的环境变?->
<property name="java.home" value="${env.JAVA_HOME}"/>
<property name="ant.home" value="${env.ANT_HOME}"/>
<property name="app.name" value="hello-ant"/>
<property name="app.jar" value="${app.name}.jar"/>
<property name="app.copyright" value=" Copyright (c) 2002 The Neusoft Software Foundation. All rights reserved."/>
<!--app中src的属?->
<property name="src.dir" value="src" />
<property name="src.main" value="${src.dir}/main"/>
<property name="src.script" value="${src.dir}/script"/>
<property name="lib.dir" value="lib"/>
<property name="build.dir" value="build" />
<property name="build.classes" value="${build.dir}/classes"/>
<property name="build.docs" value="${build.dir}/docs"/>
<property name="build.docs.api" value="${build.docs}/api"/>
<property name="build.lib" value="${build.dir}/lib"/>
<property name="dist.dir" value="dist"/>
<property name="dist.bin" value="${dist.dir}/bin"/>
<property name="dist.docs" value="${dist.dir}/docs"/>
<property name="dist.lib" value="${dist.dir}/lib"/>
<property name="docs.dir" value="docs"/>
定义一l\径以后可以通过id重用q组路径 Q例Q?br /> <javac srcdir="src/main" destdir="build/classes">
<classpath refid="classpath"/>
</javac>
-->
<path id="classpath">
<!--本项目只有一个javaQ用不上classpathQ这里只是做个例?->
<pathelement location="${build.classes}"/>
<pathelement path="${java.home}/lib/tools.jar"/>
</path>
===================================================================
init 准备目录(File Tasks)
主要的目录结构通常是不会变的,一L成他?br /> ===================================================================
-->
<target name="init">
<!--清除以前目录-->
<delete dir="${build.dir}" failonerror="false" />
<delete dir="${dist.dir}" failonerror="false"/>
<mkdir dir="${build.dir}"/>
<mkdir dir="${build.classes}"/>
<mkdir dir="${build.docs}"/>
<mkdir dir="${build.docs.api}"/>
<mkdir dir="${build.lib}"/>
<mkdir dir="${dist.bin}"/>
<mkdir dir="${dist.lib}"/>
===================================================================
Build the code (Compile Tasks,File Tasks)
===================================================================
-->
<target name="build" depends="init">
<!--~译-->
<javac srcdir="${src.main}" destdir="${build.classes}">
<classpath refid="classpath"/>
</javac>
</target>
===================================================================
打包文档(Archive Tasks)
Create the project jars: xxx1.jar and xxx2.jar
===================================================================
-->
<target name="jars" depends="build">
<jar basedir="${build.classes}" jarfile="${build.lib}/${app.jar}"/>
</target>
===================================================================
Creates the API documentation
===================================================================
-->
<target name="javadocs"
depends="jars"
description="--> creates the API documentation">
<!--copy docs 手册... -->
<copy todir="${build.docs}">
<fileset dir="${docs.dir}"/>
</copy>
sourcepath="${src.main}"
defaultexcludes="yes"
destdir="${build.docs.api}"
author="true"
version="true"
use="true"
windowtitle="Docs API">
<doctitle><![CDATA[<h1>hello ant Docs API</h1>]]></doctitle>
<bottom><![CDATA[<i>${app.copyright}</i>]]></bottom>
<tag name="todo" scope="all" description="To do:" />
</javadoc>
</target>
===================================================================
Create the distribution that can run (Archive Tasks)
主要是从各目录中把该copy的copy?br /> ===================================================================
-->
<target name="dist" depends="javadocs">
<!--copy bin 执行文g -->
<copy todir="${dist.bin}">
<fileset dir="${src.script}/"/>
</copy>
<copy todir="${dist.docs}">
<fileset dir="${build.docs}/"/>
</copy>
<!-- copy lib 文g -->
<copy todir="${dist.lib}">
<fileset dir="${build.lib}/"/>
</copy>
<!--
===================================================================
Cleans everything(File Tasks)
例如可以删除build中的文gQ留l你发挥?br /> ===================================================================
-->
3.许多单项d... 像copy,delete,javac,jar...
<task1/>
<task2/>
<task3/>
</target>
http://jakarta.apache.org/ant/index.html
http://jakarta.apache.org/ant/manual/coretasklist.html 核心tasks
其他一大堆东西你要看也行。不q我觉得比较费旉?br />http://jakarta.apache.org/ant/manual/index.html 手册index
http://www.huihoo.com/java/ant.html
http://developer.ccidnet.com/pub/disp/Article?columnID=295&articleID=27619&pageNO=1
http://www-900.ibm.com/developerWorks/cn/java/j-ant/index.shtml
]]>
1、清IZ时目?br />2、徏立目录结?br />3、从vss或cvs中获得源文g
4、编译(~译java源文件、copy属性文件和xml{文件、编码{换)
5、徏立WAR?br />6、发?br />
二、徏立web应用?build.xml 模板
<?xml version="1.0"?>
=======================================================================
build file
-->
<project default="main" basedir="build">
<property name="dir.jdk" value="c:/jbuilderx/jdk1.4"/>
<property name="dir.classes" value="classes"/>
<property name="dir.lib" value="lib"/>
<property name="dir.web" value="web"/>
<property name="vss.serverPath" value="i:\"/>
<property name="vss.srcPath" value="/myproject/src"/>
<property name="vss.libPath" value="/myproject/lib"/>
<property name="vss.webPath" value="/myproject/webapp"/>
<property name="server.ftp.password" value="ftppassword"/>
<property name="server.ftp.serverIp" value="192.168.0.1"/>
<pathelement location="${dir.classes}"/>
<pathelement location="${dir.jdk}/jre/lib/rt.jar"/>
<include name="**/*.jar"/>
</fileset>
</path>
<delete dir="${dir.src}"/>
<delete dir="${dir.classes}"/>
<delete dir="${dir.lib}"/>
</target>
<target name="init" depends="clean">
<mkdir dir="${dir.src}"/>
<mkdir dir="${dir.classes}"/>
<mkdir dir="${dir.lib}"/>
</target>
<vssget localPath="${dir.src}"
login="${vss.login}"
vsspath="${vss.srcPath}"
recursive="true"
serverPath="${vss.serverPath}"
writable="true"/>
login="${vss.login}"
vsspath="${vss.libPath}"
recursive="true"
serverPath="${vss.serverPath}"
writable="true"/>
<vssget localPath="${dir.web}"
login="${vss.login}"
vsspath="${vss.webPath}"
recursive="true"
serverPath="${vss.serverPath}"
writable="true"/>
</target>
<javac bootclasspathref="project.class.path" debug="true"
deprecation="true" destdir="${dir.classes}" nowarn="false" target="1.2">
<src path="${dir.src}"/>
</javac>
<copy todir="${dir.classes}">
<fileset dir="${dir.src}">
<include name="**/*.properties"/>
<include name="**/*.xml"/>
<exclude name="ApplicationResources.properties"/>
</fileset>
</copy>
<native2ascii encoding="GBK" src="${dir.src}" dest="${dir.classes}"
includes="ApplicationResources.properties"/>
</target>
<war destfile="${file.war}" webxml="${dir.web}/WEB-INF/web.xml">
<lib dir="${dir.lib}"/>
<classes dir="${dir.classes}"/>
<fileset dir="${dir.web}"/>
</war>
</target>
<ftp server="${server.ftp.serverIp}"
userid="${server.ftp.userId}"
password="${server.ftp.password}">
<fileset dir=".">
<include name="${file.war}"/>
</fileset>
</ftp>
</target>
]]>
建立工程的目?
一般要Ҏ工程的实际情冉|建立工程的目录结构。但是,有一些比较通用的组lŞ式可供参考,比如所有的jakarta目都用类似的目录l构。下面让我们来看一下这U目录结构的特点?
?
目录 | 文g |
bin | 公共的二q制文gQ以及运行脚? |
build | 临时创徏的文Ӟ如类文g{? |
dist | 目标输出文gQ如生成Jar文g{? |
doc/javadocs | 文档? |
lib | 需要导出的Java? |
src | 源文? |
? build.xml文g的结?/p>
每个Task是一D可被执行的代码Q比如,前例中的javac、jar是两个最常用的Task。Ant定义了大量的核心TaskQ我们要考虑的第二个问题正是如何L握这大量的Task。其实唯一的方法就是边学习边实践,q方面最好的参考就是官方的Ant使用手册?
外部文g的?
使用外部的Property文g可以保存一些预讄的公共属性变量。这些属性可以在多个不同的Build文g中用?
可以一个外部的XML文g导入Build文g中,q样多个目的开发者可以通过引用来共享一些代码,同样Q这也有助于Build文g的重用,CZ代码如下所C:
xml"> xml"> ]> &share-variable; &build-share; ... ... |
//HelloInfoTask.java package com.sharetop.antdemo; import org.apache.tools.ant.*; public class HelloInfoTask { private String msg; public void execute() throws BuildException { System.out.println(msg); } public void setMessage(String msg) { this.msg = msg; } } |
//HelloTask.java package com.sharetop.antdemo; import org.apache.tools.ant.*; public class HelloTask extends Task implements org.apache.tools.ant.TaskContainer { private Task info; private int count; public void execute() throws BuildException { for(int i=0;i info.execute(); } public void setCount(int c){ this.count=c; } public void addTask(Task t){ this.info=t; } } |
classname="com.sharetop.antdemo.HelloTask" classpath="client.jar"/> classname="com.sharetop.antdemo.HelloInfoTask" classpath="client.jar"/> |
首先下蝲ant?a >http://jakarta.apache.org/buildsQ然后解压羃到本圎ͼ我把它压~到C:\ant目录?/p>
在环境变量修改属?/strong>
在path属性前增加Q-Q-Q-C:\ant\binQ这样就可以使用ant?/p>
build.xml文g都包含一个project和至一个target元素Qtarget元素中包含一个或多个d元素QQ务是一D可执行的代码?/p>
根元素是projectQ三个属性name,default,basedir
name指定工程的名?/p>
default指定工程默认的target元素
basedir指定工程的基路径Q如果是?”,表示为build.xml所在\?/p>
<project name="bookstore" default="about" basedir=".">
<target name="init">
<tstamp/>
<!--初始化各个变量的名字-->
<property name="build" value="build" /><!--~译后的目录-->
<property name="src" value="src" /><!--源文件的位置-->
<!--用到的环境变量的?->
<property environment="myenv" />
<property name="servletpath" value="${myenv.CATALINA_HOME}/common/lib/servlet-api.jar" />
<property name="mysqlpath" value="WEB-INF/lib/mysqldriver.jar" />
<mkdir dir="${build}" /><!--调用前面的目录参数是${xxx}-->
<mkdir dir="${build}\WEB-INF" />
<mkdir dir="${build}\WEB-INF\classes" />
<copy todir="${build}" ><!--拯目录文g到新的目录下-->
<fileset dir="${basedir}" ><!--原来的目录是basedir参数的\?->
<include name="*.jsp" />
<include name="*.bmp" />
<include name="WEB-INF/**" />
<exclude name="build.<!--不拷贝这个文?->
</fileset>
</copy>
</target>
<target name="compile" depends="init"> <!--它依赖init的执行,所以调用它先执行init-->
<javac srcdir="${src}"
destdir="${build}/WEB-INF/classes"
classpath="${servletpath}:${mysqlpath}">
</javac>
</target>
<target name="bookstorewar" depends="compile"> <!--生成war的Q?->
<war warfile="${build}/bookstore.war" web <lib dir="${build}/WEB-INF/lib"/>
<classes dir="${build}/WEB-INF/classes"/>
<fileset dir="${build}"/>
</war>
</target>
<target name="about" > <!--默认的target-->
<echo>
This build.xml file contains targets
for building bookstore web application
</echo>
</target>
</project>
我们q个build.xml在我们的应用的根目录?/strong>
所以运?a >ant的方法是:在DOS?/strong>
1.q入C:\myAppQ我们的应用目录?输入: ant Q会搜烦当前路径下的build.xml文gQ?/font>
2.直接输入ant -buildfile c:\myApp\build.xml
3.直接输入ant -buildfile c:\myApp\build.xml about
以上三种方式都执行about的targetQ如果指想编译java文gQ我们只?/p>