??xml version="1.0" encoding="utf-8" standalone="yes"?>激情综合亚洲色婷婷五月APP ,亚洲高清在线观看,亚洲欧洲无码AV电影在线观看http://www.tkk7.com/os586/category/10208.html态度军_一切,思想军_\zh-cnTue, 27 Feb 2007 10:52:16 GMTTue, 27 Feb 2007 10:52:16 GMT60Struts -- html:link 标签的?/title><link>http://www.tkk7.com/os586/archive/2006/11/09/80276.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Thu, 09 Nov 2006 14:15:00 GMT</pubDate><guid>http://www.tkk7.com/os586/archive/2006/11/09/80276.html</guid><wfw:comment>http://www.tkk7.com/os586/comments/80276.html</wfw:comment><comments>http://www.tkk7.com/os586/archive/2006/11/09/80276.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/os586/comments/commentRss/80276.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/os586/services/trackbacks/80276.html</trackback:ping><description><![CDATA[ <p><html:link> 标签用于生成HTML <a> 元素?lt;html:link> 在创链接Ӟ有两个优点:<br />(1) 允许在URL 中以多种方式包含h参数?br />(2) 当用h览器关闭Cookie Ӟ会自动重写URLQ把SessionID 作ؓh参数包含在URL 中,用于跟踪用户的Session 状态?/p> <p><html:link> 标签有以下重要属性:<br />(1) forwardQ指定全局转发链接?br />(2) hrefQ指定完整的URL 键接?br />(3) pageQ指定相对于当前|页的URL?/p> <p>        <html:rewrite> 用于输出链接中的URI部分Q但它ƈ不生成HTML <a> 元素。URI指的是URL 中协议、主机和端口以后的内宏VURI 用于指定具体的请求资源。例如,对于URLQHTTPQ?/localhost:8080/HtmlBasic.doQ它的URI?HtmlBasic.do</p> <p>CZQ?br />1、创建全局转发链接<br />    首先Q在Struts-config.xml ?lt;global-forwards> 元素中定义一?lt;forward> 元素Q?br />    <global-forwards><br />        <forward name = "index" path="/index.jsp"/><br />    </global-forwards><br />    接着Q在JSP 文g中创?lt;html:link> 标签Q?br />    <html:link forward="index"><br />        Link to Global ActionForward<br />    </html:link><br />    <html:link> 标签的forward 属性和<global-forwards> 元素中的<forward> 子元素匹配。以上代码生成如下HTML 内容Q?br />    <a href="/index.jsp">Link to Global ActionFoward</a><br />    值得注意的是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</p> <p>2、创建具有完整URL 的链?br />    如果Web 应用需要链接到其他站点Q应该给出其他站点完_QԌQ例如:<br />    <html:link href="<a ><br />        Generate an "href" directly<br />    </html:link><br />    生成HTML 代码如下Q?br />    <a href="<a >Generate</a> an "href" directly</a><br />    值得注意的是Q如果指定了<html:link> 标签的href 属性,即用户览器的Cookie 关闭Q?lt;html:link> 标签也不会把用户SessionID 作ؓh参数加和到URL 中?/p> <p>3、从当前|页中创建相对URL<br />    如果从一个网链接到同一个应用中的另一|页Q可以采用以下方式:<br />    <html:link page="/HtmlBasic.do"><br />        A relative link from this page<br />    </html:link><br />    <html:link> 标签?page 属性用于指定相对于当前应用的URI。以上代码生成如下HTML 内容Q?br />    <a href="/lib/HtmlBasic.do">......</a></p> <p>4、在URL ?URI 中包含请求参?br />    如果要在URL或URI 中包含请求参敎ͼ只要把请求参数加在URL ?URI的末ְ可以了。例如:<br />    <html:link page="/HtmlBasic.do?prop1=abc&amp;prop2=123"><br />        Hard-code the url parameters<br />    </html:link><br />    <!-- or --><br />    <html:rewrite page="/HtmlBasic.do?prop1=abc&amp;prop2=123"/><br />    以上代码生成如下HTML 内容Q?br />    <a href=/lib/HtmlBasic.do?prop1=abc&amp;prop2=123">......</a><br />    rewrite: /HtmlBasic.do?prop1=abc&amp;prop2=123</p> <p>    提示Q在HTML ?amp;amp 代表Ҏ字符 "&"</p> <p>5、在URL ?URI 中包含单个请求变?br />                  <br />        如果要在URL 中包含一个请求参敎ͼ而这人参数的值存在于当前|页可访问的一个变量中Q可以按以下Ҏ来实现?br />        Z演示q一功能Q首先创Z个当前网可讉K的变量。例如,本例中创Z两个变量Q一个是字符cdQ一个是CustomerBean Q?它们存存于一?page 范围内:<br />    <%<br />        /* <br />         * Create a string object to store as a bean in<br />         * the page content and embed in this link<br />         */<br />        String stringBean = "Value to Pass ont URL";<br />        pageContext.setAttribute("stringBean", stringBean);<br />    %><br />    <jsp:useBean id = "customerBean" scope="page" class="htmltaglibs.beans.CurstomerBean"/><br />    <jsp:setProperty name="customerBean" property="name" value="weiqin"/><br />        接着Q把q两个变量作求参敎ͼ加入到URL或URI 中:<br />    <html:link page="/HtmlBasic.do"<br />                      paramId="urlParamName"<br />                      paramName="stringBean"><br />        URL encode a parameter based on a string bean value<br />    </html:link><br />    <html:link page="/HtmlBasic.do"<br />                       paramId="urlParamName"<br />                       paramName="customerBean"<br />                       paramProperty="name"><br />        URL encode a parameter based on a customer bean value<br />    </html:link></p> <p>    rewrite: <html:rewrite page="/HtmlBasic.do"<br />                                           paramId="urlParamName" paramName="stringBean"/><br />    rewrite: <html:rewrite page="/HtmlBasic.do"                                            <br />                                           paramId="urlParamName" paramName="customerBean"<br />                                           paramProperty="name"/></p> <p>    <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"><br />        Url encode a paramter based on a string bean value<br />    </a></p> <p>    <a href="/HtmlBasic.do?urlParamName=weiqin"><br />        url encode a parameter based on a customer bean value<br />    </a></p> <p>    rewrite: /HtmlBasic.do?urlParamName=Value to Pass on Url<br />    rewrite: /HtmlBasic.do?urlParamName=weiqin<br />6、在URL ?URI 中包含多个请求变?br />    如果在URL ?URI 中包含多个请求参敎ͼ而这些参数的值来自多个变量,需要先定义一个Mapcd的java c,如java.util.HashMapQ用它来存放h变量。例如:<br />    <%<br />        /*<br />         * Strore values int a Map(HashMap in this case)<br />         * and construct the URL based on the Map<br />         * /<br />        java.util.HashMap myMap = new java.util.HashMap();<br />        myMap.put("myString", new String("myStringValue"));<br />        myMap.put("myArray" , new String[]{"str1","str2","str3"} );<br />        pageContext.setAttribute("map", myMap);<br />    %><br />    在以上代码的HaspMap 中存放了两个对象Q其中第二个对象是个字符串数l。HashMap 被存攑֜PageContext 中?接下来就可以把这个HashMap 作ؓh参数Q加入到URL ?URI 中:<br />    <%-- For this version of the <html:link> tag: --%><br />    <%-- map = a map with name/value pairs to pass on the url --%><br />    <html:link page="/HtmlBasic.do" name="map"><br />        URL encode a parameter based on value in a Map<br />    </html:link><br />    <%-- Create the same rewrite string for the above link. --%><br />    rewrite:<html:rewrite page="/HtmlBasic.do" name="map"/></p> <p>    <html:link> 标签的name 属性指定包含请求变量的HashMap 对象。HashMap 对象中的每一?key/value" 代表一Ҏ多对"h参数?h参数?。以上代码生成如下的Html 内容Q?br />    <a href="/HtmlBasic.do?myString=myStringValue&amp;myArray=str1&amp;myArray=str2&amp;myArray=str3"><br />        URL encode a parameter based on value in a Map<br />    </a><br />    <br />    rewrite:/HtmlBasic.do?myString=myStringValue&amp;myArray=str1&amp;myArray=str2&amp;myArray=str3</p> <p>       </p> <p> </p> <img src ="http://www.tkk7.com/os586/aggbug/80276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/os586/" target="_blank">水煮三国</a> 2006-11-09 22:15 <a href="http://www.tkk7.com/os586/archive/2006/11/09/80276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ant:~写build.xml的方?/title><link>http://www.tkk7.com/os586/archive/2006/10/18/75826.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Wed, 18 Oct 2006 02:01:00 GMT</pubDate><guid>http://www.tkk7.com/os586/archive/2006/10/18/75826.html</guid><wfw:comment>http://www.tkk7.com/os586/comments/75826.html</wfw:comment><comments>http://www.tkk7.com/os586/archive/2006/10/18/75826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/os586/comments/commentRss/75826.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/os586/services/trackbacks/75826.html</trackback:ping><description><![CDATA[ <h2 class="diaryTitle">~写antQbuild.xml的方? -</h2>                                       <p></p><p>下面是关于ant介的一文章,可以只看build.xml相关的部分?/p><p>我的教训Q在path中不能有I格。希望你不要犯这L错误?)</p><p>《我喜欢单:ant - java 构徏工具?/p><p>作者:陈鹏</p><p>hello ant</p><p>    理你的代码Qdoc文g,~译,配置{开发工作你是怎末做的Q自q理源目录Q编译文Ӟcopy,实施...<br />在window写bat,在unix写shellQ?br />     可惜我不怎末会写。所以我制作一个ejb的过E是q样的:<br />写代?>写个bat~译代码->l织文g(ejb-jar.xml,jboss.xml...)->压羃文g生成jar文档-><br />实施......(q有同样的测试过E?(为甚末不用jbuild?)</p><p>    q中间每ơ修攚w要经q重复的无数ơ手工copy,paste...q程Q好累,好花旉。可我确实不惛_<br />学脚本编写,unix,linux下我q得重学Q太累?/p><p>    如果你和我一样希望自动执行预定义的动作却又不惛_累,那末Q我觉得ANT工具不错Q?br />它可以以相同的用法用在不同^?跨^?。它是JAVA做的Q免费的Q开源的Q据说网上已l成了事实的JAVA<br />构徏标准Q还听说高手都用?..... ^_^</p><p>    我花?天时间才掌握了它的基本用法,我希望你能通过我的文章和试验花半天旉掌握它?/p><p>内容Q?/p><p>下蝲Q安?<br />hello ant <br />hello ant q <br />参考及下蝲 <br />下蝲Q安?br />   又下?又是一大堆参数变量?  :(<br />    <a >http://jakarta.apache.org/ant/index.html</a> 它是apache的java子项?jakarta"的子目.你可以选择<br />当前的版本,目前我是1.5?window版,以下q它讲?/p><p>    解压后ant_home用来方便讉K。ƈ保你也讄了java_home ?br />    set ant_home=D:\java\kit\ant\jakarta-ant-1.5.1    q是我的目录    </p><p>    p些,单吧?/p><p>hello ant</p><p>我们要开发一个javac:其内容只有一句,输出"hello ant"字符丌Ӏƈ使用ant完成~译和运行工作,q个例子只是Z跑通antQ不附加多余的东ѝ?/p><p>下图为文件组l,请徏立相应的目录Qƈ~写HelloAnt.java</p><p><img onmousewheel="function anonymous() { return bbimg(this) }" title="点击新窗口查看大? style="ZOOM: 100%" height="198" src="http://www.huihoo.com/java/hello-ant/images/hello-ant-dir.gif" width="425" onload="function anonymous() { java_script_:if(this.width>600)this.width=600 }" border="1" /><br /></p><p>按照人家老外的文件组l规则咱也照搬?/p><p>下面是:“hello.ant.HelloAnt.java”文件?<br />S1++++++++++++++++++++++++++++++++++++++++++++++++<br />package hello.ant;</p><p>public class HelloAnt{<br />    public static void main(String[] args){<br />        System.out.println("hello ant,ant 的第一ơ接触,好棒Q?);<br />    } <br />}  <br />E1++++++++++++++++++++++++++++++++++++++++++++++++</p><p>在项目根目录(hello-ant\)?个文Ӟant执行配置文gbuild.xml</p><p>q是Q“build.xml”文?br />S2++++++++++++++++++++++++++++++++++++++++++++++++ <br /><?xml version="1.0"  encoding="GB2312" ?></p><p><!-- 一个项?可包含很多Q务组(target) --><br /><project default="main" basedir="."></p><p>    <!-- 目中的一个Q务组,可包含很多Q?task:javac,java...) --><br />    <target name="main"></p><p>        <!--~译--><br />        <javac srcdir="src\main\hello\ant" destdir="build\classes"/></p><p>        <!--q行--><br />        <java classname="hello.ant.HelloAnt"><br />            <classpath><br />                <pathelement path="build\classes"/><br />            </classpath><br />        </java></p><p>    </target><br /></project>  </p><p>E2++++++++++++++++++++++++++++++++++++++++++++++++<br />ok,一切大功告成,哦,不,q没有运行它?/p><p>dos下进入hello-ant的目录,即build.xml所在的目录Q我们要用ant工具执行?Q?</p><p>执行: %ant_home%/bin/ant -file build.xml     用ant工具执行当前目录下的配置文gbuild.xml </p><p>或?Qant -file build.xml                    你如果设|?ant_home%/bin到path?/p><p>q次ok了,q是{案Q?/p><p><font style="BACKGROUND-COLOR: #000000" color="#ffffff"><font color="#000000"><font style="BACKGROUND-COLOR: #ffffff">命o提示W窗?/font><br /></font>D:\temp\hello-ant>ant -file build.xml<br />Buildfile: build.xml</font></p><p><font style="BACKGROUND-COLOR: #000000" color="#ffffff">main:<br />[javac] Compiling 1 source file to D:\temp\hello-ant\build\classes<br />[java] hello ant,ant 的第一ơ接触,好棒Q?/font></p><p><font style="BACKGROUND-COLOR: #000000"><font color="#ffffff">BUILD SUCCESSFUL<br />Total time: 2 seconds<br />D:\temp\hello-ant></font>  </font></p><p><br />查一下build/classes目录Q哦Q看到编译过的文件就在这?<br />build/classes/hello/ant/HelloAnt.class.</p><p>hello ant q</p><p>(此段比较废话Q可以略q?<br />你也怼_q末单的工作写个批处理不得了,又xml又ant的,把我的时间都费完了Q我用jbuild?br />webShpere不就得了Q怎末说你才明白呢Q反正网上开源项目大多数都用ant,你M能给人家?.jpx吧,<br />而且q样的工具太贵,受不?当然用D的兄弟不怕^_^ )Q而且ant可以让你明确的管理和自动化所有的东西:<br />~译-实施-试...,哎,E微ȝ一点点Q但节约你以前花在零的copy,paste上的旉.而且我发现管?br />代码的质量有所提高.</p><p>我们要改qbuild.xmlQ让它做更多的事情:</p><p>定义全局变量 <br />初始?主要是徏立目?<br />~译  (已有) <br />打包为jar <br />建立API documentation <br />生成distribution产品 <br />凡事都讲I^衡,你要antl你做更多事Q当然要累一点点Q不q只用篏一ơ,以后的代码修改后的构建都?一键式"完成,我们制作一个hello的简单例子,你可以自己做j2ee的练习?/p><p>我们要扩充目录结构,使它更像回事Q?/p><p>ant处理~译之前的目录:</p><p><img onmousewheel="function anonymous() { return bbimg(this) }" title="点击新窗口查看大? style="ZOOM: 110%" height="170" src="http://www.huihoo.com/java/hello-ant/images/hello-ant-dir-advance-2.gif" width="425" onload="function anonymous() { java_script_:if(this.width>600)this.width=600 }" border="1" /></p><p>ant处理之后的目录:</p><p><img onmousewheel="function anonymous() { return bbimg(this) }" title="点击新窗口查看大? style="ZOOM: 100%" height="283" src="http://www.huihoo.com/java/hello-ant/images/hello-ant-dir-advance-1.gif" width="454" onload="function anonymous() { java_script_:if(this.width>600)this.width=600 }" border="1" /></p><p>图中Q\src,\docs,\lib是自ql的文gl构Q\build,\dist是ant动态生成的成品?/p><p>\src                     源文Ӟjava源,script源,jsp源,xml配置.....<br />\src\main         java?br />\src\script     window,unix,liunx的执行scriptQ我们的单只有一个:<br />                  run.bat:  java hello.ant.HelloAnt</p><p>\docs                手写说明文档<br />\lib                   E序所需cd的jar,比如j2ee.jar,mail,jar...</p><p>\build               用ant动态生成的构徏目录<br />\build\classes  ~译的类文g<br />\build\docs         copy "\docs"的手写说明文档,和ant生成的api文档<br />\build\lib           攄我们自己的HelloAnt.class打包成品hello-ant.jar</p><p>\dist\bin        copy "\src\script" 得执行文?br />\dist\docs      copy "\build\docs" 的文?br />\dist\lib         除了copy "\build\lib"下的hello-ant.jar外,<br />                              q应copy "\lib"的程序所需jarQ这里我们没有?/p><p>以上是我学老外的文件组l,大家可以按照自己的爱好组l?/p><p>我们~写必要的文Ӟ </p><p>hello.ant. HelloAnt.java </p><p>已有 </p><p>\src\script.bat <br />S3+++++++++++++++++++++++++++++++++++++++++++++++<br />@echo off<br />echo ========================================================<br />echo   请先讄 Environment<br />echo .<br />echo   JAVA_HOME: %JAVA_HOME%<br />echo ======================================================</p><p>%java_home%\bin\java -classpath ..\lib\hello-ant.jar  hello.ant.HelloAnt</p><p>pause   <br />E3+++++++++++++++++++++++++++++++++++<br />\docs\index.html 随便写一个手写的文档 <br />hello ant 软g目手册docs</p><p><br />--------------------------------------------------------------------------------</p><p>讉Kapi文档</p><p>   <br />\build.xml 配置文g  <br />S4++++++++++++++++++++++++++++++++++++++++++++++++<br /><?xml version="1.0"  encoding="GB2312" ?><br /><!--<br />    =======================================================================<br />      hello-ant 目 ,学习ant工具的第2个build file.</p><p>      参照ant的jakarta-ant-1.6alpha的build.xml</p><p>      Copyright (c) 2002 The Neusoft Software Foundation.  All rights<br />      reserved.</p><p>    =======================================================================<br />--></p><p><!--<br />    文档l构?<br />    <project><br />        <property/>               全局变量的定?br />        <property/>...</p><p>        <target name="1">         dl?tasks)<br />            <javac></javac>       一javacd<br />            ...<br />            <oneTask></ontTask>   一其它Q?br />        </target></p><p>        <target name="2"><br />            <javac></javac><br />            ...<br />            <oneTask></ontTask><br />        </target><br />    </project></p><p>    project代表一个项目,<br />    default:q行到名UCؓ"dist"的target(dl?<br />    basedir:基准路径?br />--><br /><project default="dist" basedir="."></p><p><!--<br />    ===================================================================<br />      定义属性(property tasksQ?br />      最好把用到的\径呀Q名U呀都在q里定义成全局变量<br />      例:定义<br />          <property name="a" value="hello"/><br />      以后可以这L它:<br />          <property name="b" value="${a}/b"/><br />      现在:b=="hello/b"<br />    ===================================================================<br />--></p><p>    <!--主要的系l环境属?-><br />    <property environment="env"/><!--取window,unix...的环境变?-><br />    <property name="java.home" value="${env.JAVA_HOME}"/><br />    <property name="ant.home"  value="${env.ANT_HOME}"/></p><p>    <!--主要的app环境属?-><br />    <property name="app.name"      value="hello-ant"/><br />    <property name="app.jar"       value="${app.name}.jar"/><br />    <property name="app.copyright" value=" Copyright (c) 2002 The Neusoft Software Foundation.  All rights reserved."/></p><p><br />    <!--app中src的属?-><br />    <property name="src.dir"    value="src" /><br />    <property name="src.main"   value="${src.dir}/main"/><br />    <property name="src.script" value="${src.dir}/script"/></p><p>    <!--app用到的lib--><br />    <property name="lib.dir" value="lib"/></p><p>    <!--app的build目录?-><br />    <property name="build.dir"      value="build" /><br />    <property name="build.classes"  value="${build.dir}/classes"/><br />    <property name="build.docs"     value="${build.dir}/docs"/><br />    <property name="build.docs.api" value="${build.docs}/api"/><br />    <property name="build.lib"      value="${build.dir}/lib"/></p><p>    <!--app的dist (distribution) 目录?-><br />    <property name="dist.dir"      value="dist"/><br />    <property name="dist.bin"      value="${dist.dir}/bin"/><br />    <property name="dist.docs"     value="${dist.dir}/docs"/><br />    <property name="dist.lib"      value="${dist.dir}/lib"/></p><p>    <!--app的docs目录?-><br />    <property name="docs.dir"      value="docs"/></p><p>    <!--<br />    定义一l\径以后可以通过id重用q组路径 Q例Q?br />    <javac srcdir="src/main" destdir="build/classes"><br />            <classpath refid="classpath"/><br />    </javac><br />    --><br />    <path id="classpath"><br />        <!--本项目只有一个javaQ用不上classpathQ这里只是做个例?-><br />        <pathelement location="${build.classes}"/><br />        <pathelement path="${java.home}/lib/tools.jar"/><br />    </path></p><p><!--<br />    ===================================================================<br />      init 准备目录(File Tasks)<br />      主要的目录结构通常是不会变的,一L成他?br />    ===================================================================<br />--><br />    <target name="init"><br />        <!--清除以前目录--><br />        <delete dir="${build.dir}" failonerror="false" /><br />        <delete dir="${dist.dir}"  failonerror="false"/></p><p>        <!--准备目录--><br />        <mkdir dir="${build.dir}"/><br />        <mkdir dir="${build.classes}"/><br />        <mkdir dir="${build.docs}"/><br />        <mkdir dir="${build.docs.api}"/><br />        <mkdir dir="${build.lib}"/></p><p>        <mkdir dir="${dist.dir}"/><br />        <mkdir dir="${dist.bin}"/><br />        <mkdir dir="${dist.lib}"/></p><p>    </target></p><p><!--<br />    ===================================================================<br />      Build the code (Compile Tasks,File Tasks)<br />    ===================================================================<br />--><br />    <target name="build" depends="init"><br />        <!--~译--><br />        <javac srcdir="${src.main}" destdir="${build.classes}"><br />            <classpath refid="classpath"/><br />        </javac><br />    </target></p><p><!--<br />    ===================================================================<br />      打包文档(Archive Tasks)<br />      Create the project jars: xxx1.jar and xxx2.jar<br />    ===================================================================<br />--><br />   <target name="jars" depends="build"><br />        <jar basedir="${build.classes}" jarfile="${build.lib}/${app.jar}"/><br />    </target></p><p><!--<br />     ===================================================================<br />       Creates the API documentation<br />     ===================================================================<br />--><br />    <target name="javadocs"<br />            depends="jars"<br />            description="--> creates the API documentation"><br />        <!--copy docs 手册... --><br />        <copy todir="${build.docs}"><br />            <fileset dir="${docs.dir}"/><br />        </copy></p><p>        <javadoc packagenames="hello.ant.*"<br />                 sourcepath="${src.main}"<br />                 defaultexcludes="yes"<br />                 destdir="${build.docs.api}"<br />                 author="true"<br />                 version="true"<br />                 use="true"<br />                 windowtitle="Docs API"><br />             <doctitle><![CDATA[<h1>hello ant Docs API</h1>]]></doctitle><br />             <bottom><![CDATA[<i>${app.copyright}</i>]]></bottom><br />             <tag name="todo" scope="all" description="To do:" /><br />         </javadoc><br />    </target></p><p><!--<br />     ===================================================================<br />       Create the distribution that can run (Archive Tasks)<br />       主要是从各目录中把该copy的copy?br />     ===================================================================<br />--><br />   <target name="dist" depends="javadocs"><br />        <!--copy bin 执行文g --><br />        <copy todir="${dist.bin}"><br />            <fileset dir="${src.script}/"/><br />        </copy><br />        <copy todir="${dist.docs}"><br />            <fileset dir="${build.docs}/"/><br />        </copy><br />        <!-- copy lib 文g --><br />        <copy todir="${dist.lib}"><br />            <fileset dir="${build.lib}/"/><br />        </copy></p><p>    </target><br /><!--<br />     ===================================================================<br />      Cleans everything(File Tasks)<br />      例如可以删除build中的文gQ留l你发挥?br />     ===================================================================<br />--></p><p></project>  </p><p>E4++++++++++++++++++++++++++++++++++++++++++++++</p><p>build.xml多了些,但其实很单:(注释比较详细可以参照Q这里再单说一?</p><p>一个build.xml包含一个工E的自动化处理的完整xml说明Qƈ且基本由3U东东组成:</p><p><project ></p><p>    1.全局变量的定?br />    <property/></p><p>    2.dl?br />    <target><br />        3.许多单项d... 像copy,delete,javac,jar...<br />        <task1/><br />        <task2/><br />        <task3/><br />    </target></p><p></project></p><p>参考及下蝲Q?/p><p>ant最C载:<br /><a >http://jakarta.apache.org/ant/index.html</a></p><p>ant具体的编写方法参考ant手册以下2部分ŞQ?br /><a >http://jakarta.apache.org/ant/manual/using</a> 使用说明<br /><a >http://jakarta.apache.org/ant/manual/coretasklist.html</a> 核心tasks<br />其他一大堆东西你要看也行。不q我觉得比较费旉?br /><a >http://jakarta.apache.org/ant/manual/index.html</a>  手册index</p><p>huihoo.com译改编的ant/manual/using<br /><a >http://www.huihoo.com/java/ant.html</a></p><p>用ANT构造Application作者:余斌斌  ?<br /><a >http://developer.ccidnet.com/pub/disp/Article?columnID=295&articleID=27619&pageNO=1</a></p><p>ibm 利用 Ant ?JUnit q行增量开发——用单元测试来逐步改进代码<br /><a >http://www-900.ibm.com/developerWorks/cn/java/j-ant/index.shtml</a></p><p>关于作者:</p><p>陈鹏Q东软西安公司。作Z名狂热的E序员希望每一天都能成长进步,q希望与大家分n快乐和知识?br />L以下方式和他联系Qemail <a href="mailto:chen56@msn.com">chen56@msn.com</a>  </p><img src ="http://www.tkk7.com/os586/aggbug/75826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/os586/" target="_blank">水煮三国</a> 2006-10-18 10:01 <a href="http://www.tkk7.com/os586/archive/2006/10/18/75826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ANT: 一个通用Build.xml模板的徏立[转自蚂蚱Blog]http://www.tkk7.com/os586/archive/2006/10/18/75819.html水煮三国水煮三国Wed, 18 Oct 2006 01:50:00 GMThttp://www.tkk7.com/os586/archive/2006/10/18/75819.htmlhttp://www.tkk7.com/os586/comments/75819.htmlhttp://www.tkk7.com/os586/archive/2006/10/18/75819.html#Feedback0http://www.tkk7.com/os586/comments/commentRss/75819.htmlhttp://www.tkk7.com/os586/services/trackbacks/75819.html 建立web应用?ant build.xml 模板

一、徏立Web应用步骤
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="file.war" value="myapp.war"/>

  <property name="dir.jdk" value="c:/jbuilderx/jdk1.4"/>

  <property name="dir.src" value="src"/>
  <property name="dir.classes" value="classes"/>
  <property name="dir.lib" value="lib"/>
  <property name="dir.web" value="web"/>

  <property name="vss.login" value="userId,password"/>
  <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.userId" value="ftpuser"/>
  <property name="server.ftp.password" value="ftppassword"/>
  <property name="server.ftp.serverIp" value="192.168.0.1"/>

  <path id="project.class.path">
    <pathelement location="${dir.classes}"/>
 <pathelement location="${dir.jdk}/jre/lib/rt.jar"/>

    <fileset dir="${dir.lib}">
        <include name="**/*.jar"/>
    </fileset>
  </path>

  <target name="clean">
   <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>

  <target name="getFromVcm" depends="init">
 <vssget localPath="${dir.src}"
  login="${vss.login}"
  vsspath="${vss.srcPath}"
  recursive="true"
  serverPath="${vss.serverPath}"
  writable="true"/>

 <vssget localPath="${dir.lib}"
  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>

  <target name="compile" depends="getFromVcm">
 <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>

  <target name="buildWar" depends="compile">
 <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>

  <target name="deploy" depends="buildWar">
    <ftp server="${server.ftp.serverIp}"
    userid="${server.ftp.userId}"
       password="${server.ftp.password}">
 <fileset dir=".">
      <include name="${file.war}"/>
    </fileset>
 </ftp>
  </target>

  <target name="main" description="" depends="deploy"/>

</project>



水煮三国 2006-10-18 09:50 发表评论
]]>
Ant: 中文教程?/title><link>http://www.tkk7.com/os586/archive/2006/10/17/75681.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Tue, 17 Oct 2006 08:30:00 GMT</pubDate><guid>http://www.tkk7.com/os586/archive/2006/10/17/75681.html</guid><wfw:comment>http://www.tkk7.com/os586/comments/75681.html</wfw:comment><comments>http://www.tkk7.com/os586/archive/2006/10/17/75681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/os586/comments/commentRss/75681.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/os586/services/trackbacks/75681.html</trackback:ping><description><![CDATA[ <p>基本应用 <br /><br /><strong>建立工程的目?</strong><br /><br />一般要Ҏ工程的实际情冉|建立工程的目录结构。但是,有一些比较通用的组lŞ式可供参考,比如所有的jakarta目都用类似的目录l构。下面让我们来看一下这U目录结构的特点?<br /><br />? <br /><br /></p> <table bordercolordark="#ffffff" border="1"> <tbody> <tr> <td>目录 </td> <td>文g </td> </tr> <tr> <td>bin </td> <td>公共的二q制文gQ以及运行脚?</td> </tr> <tr> <td>build </td> <td>临时创徏的文Ӟ如类文g{?</td> </tr> <tr> <td>dist </td> <td>目标输出文gQ如生成Jar文g{?</td> </tr> <tr> <td>doc/javadocs </td> <td>文档?</td> </tr> <tr> <td>lib </td> <td>需要导出的Java?</td> </tr> <tr> <td>src </td> <td>源文?</td> </tr> </tbody> </table> <br />对于一个简单的工程Q一般包括表1的几个目录。其中bin、lib、doc和src目录需要在<a >CVS</a>的控制之下。当然在q样的目录结构上Q也可以做一些调_例如Q可以徏立一个extra目录来放|需要发布的Jar文g、Inf文g及图像文件等。同P如果开发Web应用可以建立一个Web目录攄JSP、HTML{文件?<br /><br />如果我们开发的是一个比较复杂的目Q包括多个子目Qƈ且各个子目是由不同的开发h员来完成的,那么要如何来设计它的目录l构Q首先有一Ҏ需要确定的Q不同的子项目应该拥有不同的Build文gQƈ且整个项目也应该有一个ȝBuild文g。可以通过Antd或是AntCalld调用子项目的Build文gQ如下例Q?<br /><br /><table cellspacing="0"><tbody><tr><td class="code"><target name="core" depends="init"><br /><ant dir="components" target="core" /><br /><ant dir="waf/src" target="core" /><br /><ant dir="apps" target="core" /><br /></target></td></tr></tbody></table><br /><br />在各个子目的耦合不是非常紧密的情况下Q各个子目应该有各自独立的目录l构Q也是说它们可以有自己的src、doc、build、dist{目录及自己的build.<a >xml</a>文gQ但是可以共享lib和bin目录。而对于那些耦合紧密的子目Q则推荐使用同一个src目录Q但是不同的子项目有不同的子目录Q各个子目的build.<a >xml</a>文g可以攑֜根目录下Q也可以Ud各个子项目的目录下?<br /><br /><strong>~写Build文g </strong><br /><br />要用好Ant工具Q关键是要编写一个build.<a >xml</a>文g。要~写Z个结构良好、灵zd扩展的Build文gQ有两个问题要考虑Q一是了解Build文g的基本结构,二是了解Ant定义的大量Q务?<br /><br />Ant的Build文g是一个标准的XML文gQ它包含一个根节点ProjectQ每个Project定义了至一个或多个TargetQ每个Target又是一pdTask的集合。它们之间的关系如图2所C?<br /><p align="center"><img height="244" src="http://www.javaresource.org/h000/h13/img200606262025170.gif" width="260" /><br />? build.<a >xml</a>文g的结?/p><br />每个Task是一D可被执行的代码Q比如,前例中的javac、jar是两个最常用的Task。Ant定义了大量的核心TaskQ我们要考虑的第二个问题正是如何L握这大量的Task。其实唯一的方法就是边学习边实践,q方面最好的参考就是官方的Ant使用手册?<br /><br /><strong>外部文g的?</strong><br /><br />使用外部的Property文g可以保存一些预讄的公共属性变量。这些属性可以在多个不同的Build文g中用?<br /><br />可以一个外部的XML文g导入Build文g中,q样多个目的开发者可以通过引用来共享一些代码,同样Q这也有助于Build文g的重用,CZ代码如下所C: <br /><br /><table cellspacing="0"><tbody><tr><td class="code">xml"><br />xml"><br />]><br /><project basedir="." default="complie" name="main"><br />&share-variable;<br />&build-share;<br />... ...</project></td></tr></tbody></table><br /><br />在J2EE目中的应用 <br /><br />只要掌握了Ant的用方法,在J2EE目中的应用与在其它目中的应用q没有太大的不同Q但是仍有几Ҏ需要注意的?<br /><br />一是要清楚War和Jar文g的目录结构,主要是War的配|文件web.<a >xml</a>文g的位|和EJB的配|文Ӟejb-jar.<a >xml</a>?a >weblogic</a>-ejb-jar.<a >xml</a>{)的位|,在调用Jard打包文g时一定要记得把它们也包含q来。一般在~译之前p注意把这些需打包的文件拷入相应目录下。二是在J2EE目中可能会涉及C些特D的dQ比如在Weblogic中会调用ejbc预编译EJB的代码存根,或者需要在Ant中同时发布Jar到相应的服务器中{。可以用两种途径实现q些dQ一是扩展Antd实现q些dQ二是直接用Javad来执行这些命令。下面是打包、发布一个EJB的build.<a >xml</a>配置文g片断Q代码如下: <br /><br /><table cellspacing="0"><tbody><tr><td class="code"><target name="deploy_HelloEJB" depends="compile"><br /><delete dir="${temp}/ejb_make" /><!-- 首先删除临时目录 --><br /><delete file="${temp}/helloEJB.jar" /><br /><!-- 删除WebLogic域中老版本的EJB --><br /><delete file="${<a href=http://www.javaresource.org/weblogic/weblogic.html>weblogic</a>.deploy.dest}/helloEJB.jar" /><br /><!-- 创徏META-INF目录Q放|ejb-jar.<a href=http://www.javaresource.org/xml/xml-55.html>xml</a>?a href=http://www.javaresource.org/weblogic/weblogic.html>weblogic</a>-ejb-jar.<a href=http://www.javaresource.org/xml/xml-55.html>xml</a> --><br /><mkdir dir="${temp}/ejb_make/META-INF" /><br /><!-- 拯ejb-jar.<a href=http://www.javaresource.org/xml/xml-55.html>xml</a>?a href=http://www.javaresource.org/weblogic/weblogic.html>weblogic</a>-ejb-jar.<a href=http://www.javaresource.org/xml/xml-55.html>xml</a> C时目?-><br /><copy todir="${temp}/ejb_make/META-INF"><br /><fileset dir="etc/baseinfo"><br /><include name="*.<a href=http://www.javaresource.org/xml/xml-55.html>xml</a>" /><br /></fileset><br /></copy><br /><!-- 拯所有的helloEJBcd临时目录 --><br /><copy todir="${temp}/ejb_make/"><br /><fileset dir="${dest.classes}/"><!-- dest.classes是输出的cL件目?--><br /><include name="${dest.classes}/helloEJB/**" /><br /></fileset><br /></copy><br /><!-- 所有这些文件打包成helloEJB.jar --><br /><jar basedir="${temp}/ejb_make" jarfile="${temp}/helloEJB.jar" /><br /><!-- q行<a href=http://www.javaresource.org/weblogic/weblogic.html>weblogic</a>.ejbc~译 --><br /><java classname="<a href=http://www.javaresource.org/weblogic/weblogic.html>weblogic</a>.ejbc" classpath="${wl_cp}" fork="yes"><br /><classpath><br /><fileset dir="lib"><br /><include name="*.jar" /><br /></fileset><br /></classpath><br /><arg value="${temp}/helloEJB.jar" /><br /><arg value="${temp}/helloEJB_deploy.jar" /><br /></java><br /><!-- 拯/发布到WebLogic的{DOMAIN}\applications目录 --><br /><copy file="${temp}/helloEJB_deploy.jar" todir="${<a href=http://www.javaresource.org/weblogic/weblogic.html>weblogic</a>.deploy.dest}" /><br /></target></td></tr></tbody></table><br /><br />用Ant配合JUnit实现单元试 <br /><br />Ant 提供了JUnitd,可以执行单元试代码。如何用JUnitQ以及如何编写测试用?TestCase)Q感兴趣的读者可以参阅JUnit的相x档。在Ant中用JUnit的方法非常简单,首先需要把junit.jar拷入ANT_HOME\lib下,认在这个目录下有optional.jarQ因为JUnit是Ant的扩展Q务,需要引用这个扩展包。然后就是在Build文g中加入JUnit的Q务,代码如下Q?<br /><br /><table cellspacing="0"><tbody><tr><td class="code"><target name="run" depends="client"><br /><junit fork="yes" haltonfailure="yes" printsummary="yes"><br /><classpath><br /><pathelement location="client.jar" /><br /></classpath><br /><formatter type="plain" /><br /><test http:="" www.javaresource.org="" ant="" ant-57.html?="" name="com.sharetop.<a href=">antdemo.HelloWorldTest" /><br /></test></junit><br /></target></td></tr></tbody></table><br /><br />高话题 <br /><br /><strong>为Ant开发扩展Q?</strong><br /><br />为Ant实现扩展d其实是非常容易的Q只需按照以下几个步骤卛_Q?<br /><br />1. 创徏一个Javacȝ承org.apache.tools.<a ><font color="#0000ff">ant</font></a>.Taskc; <br /><br />2. Ҏ个属性实现setҎ。Ant会根据需要自动完成类型{换; <br /><br />3. 如果扩展的Q务需要嵌套其它的TaskQ那么这个Javacd需实现接口org.apache.tools.<a ><font color="#0000ff">ant</font></a>.TaskContainerQ?<br /><br />4. 如果扩展的Q务要支持TextQ需要增加一个方法void addText(String)Q?<br /><br />5. Ҏ个嵌套的元素Q实现create、add ?addConfigured ҎQ?<br /><br />6. 实现public void executeҎQ?<br /><br />7. 在build.<a >xml</a>文g中?<taskdef>来引用自定义的Task?<br /><br />下面以一个简单的例子来说明如何ؓAnt增加一个hellodQ它可以q箋打印多条信息Q打印的ơ数由属性count指定Q而打印的内容则由它内嵌的一个helloinfod的message属性指定,看上去这非常cMJSP中自定义标签的一些概念,实现代码如下Q?<br /><br /><table cellspacing="0"><tbody><tr><td class="code">//HelloInfoTask.java<br />package com.sharetop.<a ><font color="#0000ff">ant</font></a>demo;<br />import org.apache.tools.<a ><font color="#0000ff">ant</font></a>.*;<br />public class HelloInfoTask {<br />private String msg;<br />public void execute() throws BuildException {<br />System.out.println(msg);<br />}<br />public void setMessage(String msg) {<br />this.msg = msg;<br />}<br />}</td></tr></tbody></table><br /><br />下面是外部Taskcȝ代码Q?<br /><br /><table cellspacing="0" width="365"><tbody><tr><td class="code" width="361">//HelloTask.java<br />package com.sharetop.<a ><font color="#0000ff">ant</font></a>demo;<br />import org.apache.tools.<a ><font color="#0000ff">ant</font></a>.*;<br />public class HelloTask extends Task implements org.apache.tools.<a ><font color="#0000ff">ant</font></a>.TaskContainer <br />{<br />private Task info;<br />private int count;<br />public void execute() throws BuildException {<br />for(int i=0;i<count;i++)><br />info.execute();<br />}<br />public void setCount(int c){<br />this.count=c;<br />}<br />public void addTask(Task t){<br />this.info=t;<br />}<br />}</count;i++)></td></tr></tbody></table><br /><br />实现了这两个TaskQ在build.<a >xml</a>文g中定义它的task nameQ就可以在Target中执行它了。如果你不想使用 <taskdef>标签来定义TaskQ也可以通过修改default.properties文g来实现引入新TaskQ这个文件位于org.apache.tools.<a ><font color="#0000ff">ant</font></a>.taskdefs 包里。下例是一个?标签来引入新Task的Build文g部分Q?<br /><br /><table cellspacing="0"><tbody><tr><td class="code"><target name="hello" depends="client"><br /><taskdef name="hello"><br />classname="com.sharetop.<a ><font color="#0000ff">ant</font></a>demo.HelloTask" classpath="client.jar"/><br /><taskdef name="helloinfo"><br />classname="com.sharetop.<a ><font color="#0000ff">ant</font></a>demo.HelloInfoTask" classpath="client.jar"/><br /><hello count="3"><br /><helloinfo message="hello world" /><br /></hello><br /></taskdef></taskdef></target></td></tr></tbody></table>Q未完待l) <br /></taskdef></taskdef><img src ="http://www.tkk7.com/os586/aggbug/75681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/os586/" target="_blank">水煮三国</a> 2006-10-17 16:30 <a href="http://www.tkk7.com/os586/archive/2006/10/17/75681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ant: 中文教程一http://www.tkk7.com/os586/archive/2006/10/17/75680.html水煮三国水煮三国Tue, 17 Oct 2006 08:29:00 GMThttp://www.tkk7.com/os586/archive/2006/10/17/75680.htmlhttp://www.tkk7.com/os586/comments/75680.htmlhttp://www.tkk7.com/os586/archive/2006/10/17/75680.html#Feedback1http://www.tkk7.com/os586/comments/commentRss/75680.htmlhttp://www.tkk7.com/os586/services/trackbacks/75680.html

水煮三国 2006-10-17 16:29 发表评论
]]>
Ant: 中文教程http://www.tkk7.com/os586/archive/2006/10/17/75678.html水煮三国水煮三国Tue, 17 Oct 2006 08:27:00 GMThttp://www.tkk7.com/os586/archive/2006/10/17/75678.htmlhttp://www.tkk7.com/os586/comments/75678.htmlhttp://www.tkk7.com/os586/archive/2006/10/17/75678.html#Feedback0http://www.tkk7.com/os586/comments/commentRss/75678.htmlhttp://www.tkk7.com/os586/services/trackbacks/75678.html q不是很全,只有基本的内容:
1 Ant是什么?
Apache Ant 是一个基?Java的生成工兗?br />生成工具在Y件开发中用来源代码和其他输入文件{换ؓ可执行文件的形式Q也有可能{换ؓ可安装的产品映像形式Q。随着应用E序的生成过E变得更加复杂,保在每ơ生成期间都使用_相同的生成步骤,同时实现可能多的自动化Q以便及时生一致的生成版本
2 下蝲、安装Ant
安装Ant
下蝲.zip文gQ解压羃到c:\ant1.3(后面引用?ANT_HOME%)

2.1 在你q行Ant之前需要做一些配|工作?br />? bin目录加入PATH环境变量?
? 讑֮ANT_HOME环境变量Q指向你安装Ant的目录。在一些OS上,Ant的脚本可以猜ANT_HOMEQUnix和Windos NT/2000Q-但最好不要依赖这一Ҏ?
? 可选地Q设定JAVA_HOME环境变量Q参考下面的高񔞮节Q,该变量应该指向你安装JDK的目录?br />注意Q不要将Ant?a >ant.jar文g攑ֈJDK/JRE的lib/ext目录下。Ant是个应用E序Q而lib/ext目录是ؓJDK扩展使用的(如JCEQJSSE扩展Q。而且通过扩展装入的类会有安全斚w的限制?br />2.2 q行Ant

q行Ant非常单,当你正确地安装Ant后,只要输入ant可以了?br />
? 没有指定M参数ӞAnt会在当前目录下查询build.xml文g。如果找Cq该文件作为buildfile。如果你?-find 选项。Ant׃在上U目录中LbuildfileQ直臛_达文件系l的栏V要惌Ant使用其他的buildfileQ可以用参数 -buildfile fileQ这里file指定了你想用的buildfile?br />
? 可以指定执行一个或多个target。当省略targetӞAnt使用标签<project>的default属性所指定的target?br />

命o行选项ȝQ?br />ant [options] [target [target2 [target3] ...]]
Options:
-help print this message
-projecthelp print project help information
-version print the version information and exit
-quiet be extra quiet
-verbose be extra verbose
-debug print debugging information
-emacs produce logging information without adornments
-logfile file use given file for log output
-logger classname the class that is to perform logging
-listener classname add an instance of class as a project listener
-buildfile file use specified buildfile
-find file search for buildfile towards the root of the filesystem and use the first one found
-Dproperty=value set property to value
例子
ant
使用当前目录下的build.xmlq行AntQ执行缺省的target?br />ant -buildfile test.xml
使用当前目录下的test.xmlq行AntQ执行缺省的target?br />ant -buildfile test.xml dist
使用当前目录下的test.xmlq行AntQ执行一个叫做dist的target?br />ant -buildfile test.xml -Dbuild=build/classes dist
使用当前目录下的test.xmlq行AntQ执行一个叫做dist的targetQƈ讑֮build属性的gؓbuild/classes?br />
3 ~写build.xml

Ant的buildfile是用XML写的。每个buildfile含有一个project?br />
buildfile中每个task元素可以有一个id属性,可以用这个id值引用指定的d。这个值必L唯一的。(详情请参考下面的Task节Q?br />
3.1 Projects

project有下面的属性:
Attribute Description Required
name 目名称. No
default 当没有指定target时用的~省target Yes
basedir 用于计算所有其他\径的\径。该属性可以被basedir property覆盖。当覆盖Ӟ该属性被忽略。如果属性和basedir property都没有设定,׃用buildfile文g的父目录?No
目的描qC一个顶U的<description>元素的Ş式出玎ͼ参看description节Q?br />
一个项目可以定义一个或多个target。一个target是一pd你想要执行的。执行AntӞ你可以选择执行那个target。当没有l定targetӞ使用project的default属性所定的target?br />
3.2 Targets

一个target可以依赖于其他的target。例如,你可能会有一个target用于~译E序Q一个target用于生成可执行文件。你在生成可执行文g之前必须先编译通过Q所以生成可执行文g的target依赖于编译target。Ant会处理这U依赖关pR?br />
然而,应当注意刎ͼAnt的depends属性只指定了target应该被执行的序Q如果被依赖的target无法q行Q这Udepends对于指定了依赖关pȝtarget没有媄响?br />
Ant会依照depends属性中target出现的顺序(从左到右Q依ơ执行每个target。然而,要记住的是只要某个target依赖于一个targetQ后者就会被先执行?br /><target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>
假定我们要执行target D。从它的依赖属性来看,你可能认为先执行CQ然后BQ最后A被执行。错了,C依赖于BQB依赖于AQ所以先执行AQ然后BQ然后CQ最后D被执行?br />
一个target只能被执行一ơ,x有多个target依赖于它Q看上面的例子)?br />
如果Q或如果不)某些属性被讑֮Q才执行某个target。这P允许Ҏpȝ的状态(java version, OS, 命o行属性定义等{)来更好地控制build的过E。要惌一个targetq样做,你就应该在target元素中,加入ifQ或unlessQ属性,带上target因该有所判断的属性。例如:
<target name="build-module-A" if="module-A-present"/>
<target name="build-own-fake-module-A" unless="module-A-present"/>
如果没有if或unless属性,targetM被执行?br />
可选的description属性可用来提供关于target的一行描qͼq些描述可由-projecthelp命o行选项输出?br />
你的tstamp task在一个所谓的初始化target是很好的做法Q其他的target依赖q个初始化target。要保初始化target是出现在其他target依赖表中的第一个target。在本手册中大多数的初始化target的名字是"init"?br />
target有下面的属性:
Attribute Description Required
name target的名?Yes
depends 用逗号分隔的target的名字列表,也就是依赖表?No
if 执行target所需要设定的属性名?No
unless 执行target需要清除设定的属性名?No
description 关于target功能的简短描q?No

3.3 Tasks

一个task是一D可执行的代码?br />
一个task可以有多个属性(如果你愿意的话,可以其UC为变量)。属性只可能包含对property的引用。这些引用会在task执行前被解析?br />
下面是Task的一般构造Ş式:
<name attribute1="value1" attribute2="value2" ... />
q里name是task的名字,attributeN是属性名QvalueN是属性倹{?br />
有一套内|的Qbuilt-inQtaskQ以及一些可选taskQ但你也可以~写自己的task?br />
所有的task都有一个task名字属性。Ant用属性值来产生日志信息?br />
可以ltask赋一个id属性:
<taskname id="taskID" ... />
q里taskname是task的名字,而taskID是这个task的唯一标识W。通过q个标识W,你可以在脚本中引用相应的task。例如,在脚本中你可以这P
<script ... >
task1.setFoo("bar");
</script>
讑֮某个task实例的foo属性。在另一个task中(用java~写Q,你可以利用下面的语句存取相应的实例?br />project.getReference("task1").
注意1Q如果task1q没有运行,׃会被生效Q例如:不设定属性)Q如果你在随后配|它Q你所作的一切都会被覆盖?br />
注意2Q未来的Ant版本可能不会兼容q里所提的属性,因ؓ很有可能Ҏ没有task实例Q只有proxies?br />
3.4 Properties

一个project可以有很多的properties。可以在buildfile中用property task来设定,或在Ant之外讑֮。一个property有一个名字和一个倹{property可用于task的属性倹{这是通过属性名攑֜"${"?}"之间q放在属性值的位置来实现的。例如如果有一个property builddir的值是"build"Q这个property可用于属性|${builddir}/classes。这个值就可被解析为build/classes?br />
内置属?br />
如果你用了<property> task 定义了所有的pȝ属性,Ant允许你用这些属性。例如,${os.name}对应操作pȝ的名字?br />
要想得到pȝ属性的列表可参考the Javadoc of System.getProperties?br />
除了Java的系l属性,Antq定义了一些自q内置属性:
basedir project基目录的l对路径 (?lt;project>的basedir属性一??br />ant.file buildfile的绝对\径?br />ant.version Ant的版本?br />ant.project.name 当前执行的project的名字;?lt;project>的name属性设?
ant.java.version Ant到的JVM的版本; 目前的值有"1.1", "1.2", "1.3" and "1.4".

例子
<project name="MyProject" default="dist" basedir=".">

<!-- set global properties for this build -->
<property name="src" value="."/>
<property name="build" value="build"/>
<property name="dist" value="dist"/>

<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>

<target name="compile" depends="init">
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}"/>
</target>

<target name="dist" depends="compile">
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
</target>

<target name="clean">
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>

</project>
3.5 Path-like Structures
你可以用":"?;"作ؓ分隔W,指定cMPATH和CLASSPATH的引用。Ant会把分隔W{换ؓ当前pȝ所用的分隔W?br />
当需要指定类D\径的值时Q可以用嵌套元素。一般的形式?br /><classpath>
<pathelement path="${classpath}"/>
<pathelement location="lib/helper.jar"/>
</classpath>
location属性指定了相对于project基目录的一个文件和目录Q而path属性接受逗号或分号分隔的一个位|列表。path属性一般用作预定义的\径-Q其他情况下Q应该用多个location属性?br />
为简zv见,classpath标签支持自己的path和location属性。所以:
<classpath>
<pathelement path="${classpath}"/>
</classpath>
可以被简写作Q?br /><classpath path="${classpath}"/>
也可通过<fileset>元素指定路径。构成一个fileset的多个文件加入path-like structure的顺序是未定的?br /><classpath>
<pathelement path="${classpath}"/>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="classes"/>
</classpath>
上面的例子构造了一个\径值包括:${classpath}的\径,跟着lib目录下的所有jar文gQ接着是classes目录?br />
如果你想在多个task中用相同的path-like structureQ你可以?lt;path>元素定义他们Q与target同Q,然后通过id属性引用-Q参考Referencs例子?br />
path-like structure可能包括对另一个path-like structurede的引用(通过嵌套<path>元素Q:
<path id="base.path">
<pathelement path="${classpath}"/>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="classes"/>
</path>
<path id="tests.path">
<path refid="base.path"/>
<pathelement location="testclasses"/>
</path>
前面所提的关于<classpath>的简z写法对?lt;path>也是有效的,如:
<path id="tests.path">
<path refid="base.path"/>
<pathelement location="testclasses"/>
</path>
可写成:
<path id="base.path" path="${classpath}"/>
命o行变?br />
有些task可接受参敎ͼq将其传递给另一个进E。ؓ了能在变量中包含I格字符Q可使用嵌套的arg元素?br />Attribute Description Required
value 一个命令行变量Q可包含I格字符?只能用一?br />line I格分隔的命令行变量列表?
file 作ؓ命o行变量的文g名;会被文g的绝对名替代?
path 一个作为单个命令行变量的path-like的字W串Q或作ؓ分隔W,Ant会将其{变ؓ特定q_的分隔符?

例子
<arg value="-l -a"/>
是一个含有空格的单个的命令行变量?br /><arg line="-l -a"/>
是两个空格分隔的命o行变量?br /><arg path="/dir;/dir2:\dir3"/>
是一个命令行变量Q其值在DOSpȝ上ؓ\dir;\dir2;\dir3Q在Unixpȝ上ؓ/dir:/dir2:/dir3 ?br />
References

buildfile元素的id属性可用来引用q些元素。如果你需要一遍遍的复制相同的XML代码块,q一属性就很有用-Q如多次使用<classpath>l构?br />
下面的例子:
<project ... >
<target ... >
<rmic ...>
<classpath>
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/>
<pathelement path="${additional.path}"/>
</classpath>
</rmic>
</target>
<target ... >
<javac ...>
<classpath>
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/>
<pathelement path="${additional.path}"/>
</classpath>
</javac>
</target>
</project>
可以写成如下形式Q?br /><project ... >
<path id="project.class.path">
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/>
<pathelement path="${additional.path}"/>
</path>
<target ... >
<rmic ...>
<classpath refid="project.class.path"/>
</rmic>
</target>
<target ... >
<javac ...>
<classpath refid="project.class.path"/>
</javac>
</target>
</project>
所有用PatternSets, FileSets ?path-like structures嵌套元素的task也接受这U类型的引用?br />


4.1 FileQDirectoryQ类
4.1.1 Mkdir
? 创徏一个目录,如果他的父目录不存在Q也会被同时创徏?br />? 例子Q?br /><mkdir dir="build/classes"/>
? 说明Q?如果build不存在,也会被同时创?br />4.1.2 Copy
? 拯一个(l)文g、目?br />? 例子Q?br />1. 拯单个的文Ӟ
<copy file="myfile.txt" tofile="mycopy.txt"/>
2. 拯单个的文件到指定目录?br /><copy file="myfile.txt" todir="../some/other/dir"/>
3. 拯一个目录到另外一个目录下
<copy todir="../new/dir">
<fileset dir="src_dir"/>
</copy>
4. 拯一Ҏ件到指定目录?br /><copy todir="../dest/dir">
<fileset dir="src_dir">
<exclude name="**/*.java"/>
</fileset>
</copy>

<copy todir="../dest/dir">
<fileset dir="src_dir" excludes="**/*.java"/>
</copy>
5. 拯一Ҏ件到指定目录下,文件名后增加。Bak后缀
<copy todir="../backup/dir">
<fileset dir="src_dir"/>
<mapper type="glob" from="*" to="*.bak"/>
</copy>
6. 拯一l文件到指定目录下,替换其中的@标签@内容
<copy todir="../backup/dir">
<fileset dir="src_dir"/>
<filterset>
<filter token="TITLE" value="Foo Bar"/>
</filterset>
</copy>
4.1.3 Delete
? 删除一个(l)文g或者目?br />? 例子
1. 删除一个文?br /><delete file="/lib/2. 删除指定目录及其子目?br /><delete dir="lib"/>
3. 删除指定的一l文?br /><delete>
<fileset dir="." includes="**/*.bak"/>
</delete>
4. 删除指定目录及其子目录,包括他自?br /><delete includeEmptyDirs="true">
<fileset dir="build"/>
</delete>
4.1.4 Move
? Ud或重命名一个(l)文g、目?br />? 例子Q?br />1. Ud或重命名一个文?br /><move file="file.orig" tofile="file.moved"/>
2. Ud或重命名一个文件到另一个文件夹下面
<move file="file.orig" todir="dir/to/move/to"/>
3. 一个目录移到另外一个目录下
<move todir="new/dir/to/move/to">
<fileset dir="src/dir"/>
</move>
4. 一l文件移动到另外的目录下
<move todir="some/new/dir">
<fileset dir="my/src/dir">
<include name="**/*.jar"/>
<exclude name="**/
</fileset>
</move>
5. Ud文gq程中增加。Bak后缀
<move todir="my/src/dir">
<fileset dir="my/src/dir">
<exclude name="**/*.bak"/>
</fileset>
<mapper type="glob" from="*" to="*.bak"/>
</move>




4.2 Java相关
4.2.1 Javac
? ~译java原代?br />? 例子
1. <javac srcdir="${src}"
destdir="${build}"
classpath="xyz.jar"
debug="on"
/>
~译${src}目录及其子目录下的所有。Java文gQ。Class文g放?{build}指定的目录下,classpath表示需要用到的cL件或者目录,debug讄为on表示输出debug信息
2. <javac srcdir="${src}:${src2}"
destdir="${build}"
includes="mypackage/p1/**,mypackage/p2/**"
excludes="mypackage/p1/testpackage/**"
classpath="xyz.jar"
debug="on"
/>
~译${src}?{src2}目录及其子目录下的所有。Java文gQ但是package/p1/**,mypackage/p2/**被~译Q而mypackage/p1/testpackage/**不会被~译。Class文g放?{build}指定的目录下,classpath表示需要用到的cL件或者目录,debug讄为on表示输出debug信息
3. <property name="classpath" value=".;./

<javac srcdir="${src}"
destdir="${src}"
classpath="${classpath}"
debug="on"
/>
路径是在property中定义的
4.2.2 java
? 执行指定的javac?br />

? 例子Q?br />1. <java classname="test.Main">
<classpath>
<pathelement location="dist/test.jar"/>
<pathelement path="${java.class.path}"/>
</classpath>
</java>
classname中指定要执行的类Qclasspath讑֮要用的环境变量
2. <path id="project.class.path">
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/>
<pathelement path="${additional.path}"/>
</path>

<target ... >
<rmic ...>
<classpath refid="project.class.path"/>
</rmic>
</target>





4.3 打包相关
4.3.1 jar
? 一l文件打?br />? 例子Q?br />1. <jar destfile="${dist}/lib/app.jar" basedir="${build}/classes"/>
?{build}/classes下面的所有文件打包到${dist}/lib/app.jar?br />2. <jar destfile="${dist}/lib/app.jar"
basedir="${build}/classes"
includes="mypackage/test/**"
excludes="**/Test.class"
/>
?{build}/classes下面的所有文件打包到${dist}/lib/app.jar中,但是包括mypackage/testQ所有文件不包括所有的Test.class
3. <jar destfile="${dist}/lib/app.jar"
basedir="${build}/classes"
includes="mypackage/test/**"
excludes="**/Test.class"
manifest=”my.mf?br />/>
manifest属性指定自qMETA-INF/MANIFEST.MF文gQ而不是由pȝ生成
4.3.2 war
? 对Jar的扩展,用于打包Web应用
? 例子Q?br />? 假设我们的文件目录如下:
thirdparty/libs/
jdbc1.jar
thirdparty/libs/jdbc2.jar
build/main/com/myco/myapp/Servlet.class
src/metadata/myapp.xml
src/html/myapp/index.html
src/jsp/myapp/front.jsp
src/graphics/images/gifs/small/logo.gif
src/graphics/images/gifs/large/logo.gif
? 下面是我们的d的内容:
<war destfile="myapp.war" web<fileset dir="src/html/myapp"/>
<fileset dir="src/jsp/myapp"/>
<lib dir="thirdparty/libs">
<exclude name="
</lib>
<classes dir="build/main"/>
<zipfileset dir="src/graphics/images/gifs"
prefix="images"/>
</war>
? 完成后的l果Q?br />WEB-INF/web.
xml
WEB-INF/lib/jdbc2.jar
WEB-INF/classes/com/myco/myapp/Servlet.class
META-INF/MANIFEST.MF
index.html
front.jsp
images/small/logo.gif
images/large/logo.gif
4.3.3 ear
? 用于打包企业应用
? 例子
<ear destfile="${build.dir}/myapp.ear" app<fileset dir="${build.dir}" includes="*.jar,*.war"/>
</ear>



4.4 旉?br />在生成环境中使用当前旉和日期,以某U方式标记某个生成Q务的输出Q以便记录它是何时生成的Q这l常是可取的。这可能涉及~辑一个文Ӟ以便插入一个字W串来指定日期和旉Q或这个信息合q到 JAR ?zip 文g的文件名中?br />q种需要是通过单但是非常有用的 tstamp d来解决的。这个Q务通常在某ơ生成过E开始时调用Q比如在一?init 目标中。这个Q务不需要属性,许多情况下只需 <tstamp/> p够了?br />tstamp 不生Q何输出;相反Q它Ҏ当前pȝ旉和日期设|?Ant 属性。下面是 tstamp 讄的一些属性、对每个属性的说明Q以及这些属性可被设|到的值的例子Q?br />属?说明 例子
DSTAMP 讄为当前日期,默认格式为yyyymmdd 20031217
TSTAMP 讄为当前时_默认格式?hhmm 1603
TODAY 讄为当前日期,带完整的月䆾 2003 q?12 ?17 ?br />例如Q在前一节中,我们按如下方式创Z一?JAR 文gQ?br />
<jar destfile="package.jar" basedir="classes"/>

在调?tstamp d之后Q我们能够根据日期命名该 JAR 文gQ如下所C:

<jar destfile="package-${DSTAMP}.jar" basedir="classes"/>

因此Q如果这个Q务在 2003 q?12 ?17 日调用,?JAR 文g被命名?package-20031217.jar?br />q可以配|?tstamp d来设|不同的属性,应用一个当前时间之前或之后的时间偏U,或以不同的方式格式化该字W串。所有这些都是用一个嵌套的 format 元素来完成的Q如下所C:

<tstamp>
<format property="OFFSET_TIME"
pattern="HH:mm:ss"
offset="10" unit="minute"/>
</tstamp>

上面的清单将 OFFSET_TIME 属性设|ؓ距离当前旉 10 分钟之后的小时数、分钟数和秒数?br />用于定义格式字符串的字符?java.text.SimpleDateFormat cL定义的那些格式字W相?br />


4.5 执行SQL语句
? 通过
jdbc执行SQL语句
? 例子Q?br />1. <sql
driver="org.gjt.mm.mysql.Driver"
url="userid="root"
password="root"
src="data.sql"
/>
2. <sql
driver="org.database.
url="userid="sa"
password="pass"
src="data.sql"
rdbms="oracle"
version="8.1."
>
</sql>
只有在oracle、版本是8.1的时候才执行



4.6 发送邮?br />? 使用SMTP服务器发送邮?br />? 例子Q?br /><mail mailhost="smtp.myisp.com" mailport="1025" subject="Test build">
<from address="me@myisp.com"/>
<to address="all@xyz.com"/>
<message>The ${buildname} nightly build has completed</message>
<fileset dir="dist">
<includes name="**/*.zip"/>
</fileset>
</mail>
? mailhostQ?SMTP服务器地址
? mailportQ?服务器端?br />? subjectQ?主题
? fromQ?发送h地址
? toQ?接受人地址
? messageQ?发送的消息
? filesetQ?讄附g


水煮三国 2006-10-17 16:27 发表评论
]]>
Ant: 入门Q配|和使用http://www.tkk7.com/os586/archive/2006/10/17/75597.html水煮三国水煮三国Tue, 17 Oct 2006 06:02:00 GMThttp://www.tkk7.com/os586/archive/2006/10/17/75597.htmlhttp://www.tkk7.com/os586/comments/75597.htmlhttp://www.tkk7.com/os586/archive/2006/10/17/75597.html#Feedback0http://www.tkk7.com/os586/comments/commentRss/75597.htmlhttp://www.tkk7.com/os586/services/trackbacks/75597.html  

首先下蝲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>

ant -buildfile c:\myApp\build.xml  compile



水煮三国 2006-10-17 14:02 发表评论
]]>
վ֩ģ壺 Ļ߾Ʒѹۿַ| ҹˬˬˬŮѹۿӰԺ| ߹ۿվ| ϺɫϺҳa| Ʒ99Ʒþ| þþƷ鶹| ƷĻѹۿҹ| 츾þþ| ŮһͰһһƵ| AV˳ۺ| ɫƵ߹ۿ| ޹ۺ | avպƷþþþþa| 99þѾƷ72Ʒž| ޾aa߿| ձѹۿ| Ʒ| ҹƷ| þþƷһ| ޳˼| ȫƵѹۿ| ĻƵ| ޾ƷþþþþðĦ| ĻAëƬ| ͼƬĻ| ƷƵһ | aëƬ| ޹ۺרӰ| ŮëƬ߿˶ | ߹ۿ| Ů˱ͰúˬƵ| Ʒһֱ| ޾ƷƬ߹ۿ| ձɫͼ߹ۿ| www.ձ| Ʒ㽶˼һ| վۿWWW߹ۿ| һƵ߹ۿ| Ļֻ| 99ƵƷȫѹۿ| 123Һ|