﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-水煮三国-随笔分类-OpenSource</title><link>http://www.blogjava.net/os586/category/10208.html</link><description>态度决定一切，思想决定出路</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 10:52:16 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 10:52:16 GMT</pubDate><ttl>60</ttl><item><title>Struts -- html:link 标签的使用</title><link>http://www.blogjava.net/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.blogjava.net/os586/archive/2006/11/09/80276.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/80276.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/11/09/80276.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/80276.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/80276.html</trackback:ping><description><![CDATA[
		<p>&lt;html:link&gt; 标签用于生成HTML &lt;a&gt; 元素。&lt;html:link&gt; 在创建超链接时，有两个优点：<br />(1) 允许在URL 中以多种方式包含请求参数。<br />(2) 当用户浏览器关闭Cookie 时，会自动重写URL，把SessionID 作为请求参数包含在URL 中，用于跟踪用户的Session 状态。</p>
		<p>&lt;html:link&gt; 标签有以下重要属性：<br />(1) forward：指定全局转发链接。<br />(2) href：指定完整的URL 键接。<br />(3) page：指定相对于当前网页的URL。</p>
		<p>        &lt;html:rewrite&gt; 用于输出超链接中的URI部分，但它并不生成HTML &lt;a&gt; 元素。URI指的是URL 中协议、主机和端口以后的内容。URI 用于指定具体的请求资源。例如，对于URL：HTTP：//localhost:8080/HtmlBasic.do，它的URI为/HtmlBasic.do</p>
		<p>示例：<br />1、创建全局转发链接<br />    首先，在Struts-config.xml 中&lt;global-forwards&gt; 元素中定义一个&lt;forward&gt; 元素：<br />    &lt;global-forwards&gt;<br />        &lt;forward name = "index" path="/index.jsp"/&gt;<br />    &lt;/global-forwards&gt;<br />    接着，在JSP 文件中创建&lt;html:link&gt; 标签：<br />    &lt;html:link forward="index"&gt;<br />        Link to Global ActionForward<br />    &lt;/html:link&gt;<br />    &lt;html:link&gt; 标签的forward 属性和&lt;global-forwards&gt; 元素中的&lt;forward&gt; 子元素匹配。以上代码生成如下HTML 内容：<br />    &lt;a href="/index.jsp"&gt;Link to Global ActionFoward&lt;/a&gt;<br />    值得注意的是，&lt;html:link&gt; 的forward 属性只引用Struts-config.xml 配置文件中&lt;global-forwards&gt;内的&lt;forward&gt; 子元素，如果引用&lt;action&gt; 内的&lt;forward&gt; 子元素，在运行时将会抛出异常：<br />    Cannot create rewrite URL: Java.Net.MalfomedURlException: Cannot retrieve ActionForward</p>
		<p>2、创建具有完整URL 的链接<br />    如果Web 应用需要链接到其他站点，应该给出其他站点完整ＵＲＬ，例如：<br />    &lt;html:link href="<a href="http://jakarta.apache.org/struts/index.html">http://jakarta.apache.org/struts/index.html</a>"&gt;<br />        Generate an "href" directly<br />    &lt;/html:link&gt;<br />    生成HTML 代码如下：<br />    &lt;a href="<a href="http://jakarta.apache.org/struts/index.html&quot;&gt;Generate">http://jakarta.apache.org/struts/index.html"&gt;Generate</a> an "href" directly&lt;/a&gt;<br />    值得注意的是，如果指定了&lt;html:link&gt; 标签的href 属性，即使用户浏览器的Cookie 关闭，&lt;html:link&gt; 标签也不会把用户SessionID 作为请求参数加和到URL 中。</p>
		<p>3、从当前网页中创建相对URL<br />    如果从一个网页链接到同一个应用中的另一网页，可以采用以下方式：<br />    &lt;html:link page="/HtmlBasic.do"&gt;<br />        A relative link from this page<br />    &lt;/html:link&gt;<br />    &lt;html:link&gt; 标签的 page 属性用于指定相对于当前应用的URI。以上代码生成如下HTML 内容：<br />    &lt;a href="/lib/HtmlBasic.do"&gt;......&lt;/a&gt;</p>
		<p>4、在URL 或 URI 中包含请求参数<br />    如果要在URL或URI 中包含请求参数，只要把请求参数加在URL 或 URI的末尾就可以了。例如：<br />    &lt;html:link page="/HtmlBasic.do?prop1=abc&amp;amp;prop2=123"&gt;<br />        Hard-code the url parameters<br />    &lt;/html:link&gt;<br />    &lt;!-- or --&gt;<br />    &lt;html:rewrite page="/HtmlBasic.do?prop1=abc&amp;amp;prop2=123"/&gt;<br />    以上代码生成如下HTML 内容：<br />    &lt;a href=/lib/HtmlBasic.do?prop1=abc&amp;amp;prop2=123"&gt;......&lt;/a&gt;<br />    rewrite: /HtmlBasic.do?prop1=abc&amp;amp;prop2=123</p>
		<p>    提示：在HTML 中&amp;amp 代表特殊字符 "&amp;"</p>
		<p>5、在URL 或 URI 中包含单个请求变量<br />                  <br />        如果要在URL 中包含一个请求参数，而这人参数的值存在于当前网页可访问的一个变量中，可以按以下方法来实现。<br />        为了演示这一功能，首先创建一个当前网页可访问的变量。例如，本例中创建了两个变量，一个是字符类型，一个是CustomerBean ， 它们存存于一个 page 范围内：<br />    &lt;%<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 />    %&gt;<br />    &lt;jsp:useBean id = "customerBean" scope="page" class="htmltaglibs.beans.CurstomerBean"/&gt;<br />    &lt;jsp:setProperty name="customerBean" property="name" value="weiqin"/&gt;<br />        接着，把这两个变量作为请求参数，加入到URL或URI 中：<br />    &lt;html:link page="/HtmlBasic.do"<br />                      paramId="urlParamName"<br />                      paramName="stringBean"&gt;<br />        URL encode a parameter based on a string bean value<br />    &lt;/html:link&gt;<br />    &lt;html:link page="/HtmlBasic.do"<br />                       paramId="urlParamName"<br />                       paramName="customerBean"<br />                       paramProperty="name"&gt;<br />        URL encode a parameter based on a customer bean value<br />    &lt;/html:link&gt;</p>
		<p>    rewrite: &lt;html:rewrite page="/HtmlBasic.do"<br />                                           paramId="urlParamName" paramName="stringBean"/&gt;<br />    rewrite: &lt;html:rewrite page="/HtmlBasic.do"                                            <br />                                           paramId="urlParamName" paramName="customerBean"<br />                                           paramProperty="name"/&gt;</p>
		<p>    &lt;html:link&gt; 标签的 paramId 属性指定请求参数名，paramName 属性指定变量的名字。如果变量为JavaBean ，用paramProperty 属性指定JavaBean 的属性。<br />    对于本例的stringBean，请求参数值为stringBean 的字符串值。对于customerBean，指定了paramProperty 属性，请求参数值为customerBean 的 name 属性值。<br />    以上代码生成如下HTML 内容：<br />    &lt;a href="/HtmlBasic.do?urlParamName=Value to Pass on Url"&gt;<br />        Url encode a paramter based on a string bean value<br />    &lt;/a&gt;</p>
		<p>    &lt;a href="/HtmlBasic.do?urlParamName=weiqin"&gt;<br />        url encode a parameter based on a customer bean value<br />    &lt;/a&gt;</p>
		<p>    rewrite: /HtmlBasic.do?urlParamName=Value to Pass on Url<br />    rewrite: /HtmlBasic.do?urlParamName=weiqin<br />6、在URL 或 URI 中包含多个请求变量<br />    如果在URL 或 URI 中包含多个请求参数，而这些参数的值来自多个变量，需要先定义一个Map类型的java 类，如java.util.HashMap，用它来存放请求变量。例如：<br />    &lt;%<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 />    %&gt;<br />    在以上代码的HaspMap 中存放了两个对象，其中第二个对象是个字符串数组。HashMap 被存放在PageContext 中。 接下来就可以把这个HashMap 作为请求参数，加入到URL 或 URI 中：<br />    &lt;%-- For this version of the &lt;html:link&gt; tag: --%&gt;<br />    &lt;%-- map = a map with name/value pairs to pass on the url --%&gt;<br />    &lt;html:link page="/HtmlBasic.do" name="map"&gt;<br />        URL encode a parameter based on value in a Map<br />    &lt;/html:link&gt;<br />    &lt;%-- Create the same rewrite string for the above link. --%&gt;<br />    rewrite:&lt;html:rewrite page="/HtmlBasic.do" name="map"/&gt;</p>
		<p>    &lt;html:link&gt; 标签的name 属性指定包含请求变量的HashMap 对象。HashMap 对象中的每一对"key/value" 代表一对或多对"请求参数名/请求参数值"。以上代码生成如下的Html 内容：<br />    &lt;a href="/HtmlBasic.do?myString=myStringValue&amp;amp;myArray=str1&amp;amp;myArray=str2&amp;amp;myArray=str3"&gt;<br />        URL encode a parameter based on value in a Map<br />    &lt;/a&gt;<br />    <br />    rewrite:/HtmlBasic.do?myString=myStringValue&amp;amp;myArray=str1&amp;amp;myArray=str2&amp;amp;myArray=str3</p>
		<p>       </p>
		<p> </p>
<img src ="http://www.blogjava.net/os586/aggbug/80276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-11-09 22:15 <a href="http://www.blogjava.net/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.blogjava.net/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.blogjava.net/os586/archive/2006/10/18/75826.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/75826.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/10/18/75826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/75826.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/75826.html</trackback:ping><description><![CDATA[
		<h2 class="diaryTitle">编写ant：build.xml的方法- -</h2>                                       
<p></p><p>下面是关于ant简介的一篇文章，可以只看build.xml相关的部分。</p><p>我的教训：在path中不能有空格。希望你不要犯这样的错误。:)</p><p>《我喜欢简单：ant - java 构建工具》</p><p>作者：陈鹏</p><p>hello ant</p><p>    管理你的代码，doc文件,编译,配置等开发工作你是怎末做的：自己管理源目录，编译文件，copy,实施...<br />在window写bat,在unix写shell？<br />     可惜我不怎末会写。所以我制作一个ejb的过程是这样的：<br />写代码-&gt;写个bat编译代码-&gt;组织文件(ejb-jar.xml,jboss.xml...)-&gt;压缩文件生成jar文档-&gt;<br />实施......(还有同样的测试过程)(为甚末不用jbuild?)</p><p>    这中间每次修改都要经过重复的无数次手工copy,paste...过程，好累，好花时间。可我确实不想去<br />学脚本编写，unix,linux下我还得重学，太累。</p><p>    如果你和我一样希望自动执行预定义的动作却又不想太累，那末，我觉得ANT工具不错：<br />它可以以相同的用法用在不同平台(跨平台)。它是JAVA做的，免费的，开源的，据说网上已经成了事实的JAVA<br />构建标准，还听说高手都用它...... ^_^</p><p>    我花了2天时间才掌握了它的基本用法，我希望你能通过我的文章和试验花半天时间就掌握它。</p><p>内容：</p><p>下载，安装 <br />hello ant <br />hello ant 进级 <br />参考及下载 <br />下载，安装<br />   又下载?又是一大堆参数变量?  :(<br />    <a href="http://jakarta.apache.org/ant/index.html">http://jakarta.apache.org/ant/index.html</a> 它是apache的java子项目"jakarta"的子项目.你可以选择<br />当前的版本，目前我是1.5版,window版，以下就用它讲。</p><p>    解压后ant_home用来方便访问。并确保你也设置了java_home 。<br />    set ant_home=D:\java\kit\ant\jakarta-ant-1.5.1    这是我的目录    </p><p>    就这些，简单吧。</p><p>hello ant</p><p>我们要开发一个java类：其内容只有一句，输出"hello ant"字符串。并使用ant完成编译和运行工作，这个例子只是为了跑通ant，不附加多余的东西。</p><p>下图为文件组织，请建立相应的目录，并编写HelloAnt.java</p><p><img onmousewheel="function anonymous()&#xD;&#xA;{&#xD;&#xA;return bbimg(this)&#xD;&#xA;}" title="点击新窗口查看大图" style="ZOOM: 100%" height="198" src="http://www.huihoo.com/java/hello-ant/images/hello-ant-dir.gif" width="425" onload="function anonymous()&#xD;&#xA;{&#xD;&#xA;java_script_:if(this.width&gt;600)this.width=600&#xD;&#xA;}" border="1" /><br /></p><p>按照人家老外的文件组织规则咱也照搬。</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 的第一次接触，好棒！");<br />    } <br />}  <br />E1++++++++++++++++++++++++++++++++++++++++++++++++</p><p>在项目根目录(hello-ant\)写1个文件：ant执行配置文件build.xml</p><p>这是：“build.xml”文件<br />S2++++++++++++++++++++++++++++++++++++++++++++++++ <br />&lt;?xml version="1.0"  encoding="GB2312" ?&gt;</p><p>&lt;!-- 一个项目,可包含很多任务组(target) --&gt;<br />&lt;project default="main" basedir="."&gt;</p><p>    &lt;!-- 项目中的一个任务组,可包含很多任务(task:javac,java...) --&gt;<br />    &lt;target name="main"&gt;</p><p>        &lt;!--编译--&gt;<br />        &lt;javac srcdir="src\main\hello\ant" destdir="build\classes"/&gt;</p><p>        &lt;!--运行--&gt;<br />        &lt;java classname="hello.ant.HelloAnt"&gt;<br />            &lt;classpath&gt;<br />                &lt;pathelement path="build\classes"/&gt;<br />            &lt;/classpath&gt;<br />        &lt;/java&gt;</p><p>    &lt;/target&gt;<br />&lt;/project&gt;  </p><p>E2++++++++++++++++++++++++++++++++++++++++++++++++<br />ok,一切大功告成，哦，不，还没有运行它。</p><p>dos下进入hello-ant的目录，即build.xml所在的目录，我们要用ant工具执行它 ， </p><p>执行: %ant_home%/bin/ant -file build.xml     用ant工具执行当前目录下的配置文件build.xml </p><p>或  ：ant -file build.xml                    你如果设置%ant_home%/bin到path中</p><p>这次ok了，这是答案：</p><p><font style="BACKGROUND-COLOR: #000000" color="#ffffff"><font color="#000000"><font style="BACKGROUND-COLOR: #ffffff">命令提示符窗口</font><br /></font>D:\temp\hello-ant&gt;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 的第一次接触，好棒！</font></p><p><font style="BACKGROUND-COLOR: #000000"><font color="#ffffff">BUILD SUCCESSFUL<br />Total time: 2 seconds<br />D:\temp\hello-ant&gt;</font>  </font></p><p><br />检查一下build/classes目录，哦，看到编译过的文件就在这里:<br />build/classes/hello/ant/HelloAnt.class.</p><p>hello ant 进级</p><p>(此段比较废话，可以略过)<br />你也许会说：这末简单的工作写个批处理不就得了，又xml又ant的，把我的时间都浪费完了，我用jbuild或<br />webShpere不就得了，怎末说你才明白呢？反正网上开源项目大多数都用ant,你总不能给人家个*.jpx吧，<br />而且这样的工具太贵，受不了(当然用D的兄弟不怕^_^ )，而且ant可以让你明确的管理和自动化所有的东西:<br />编译-实施-测试...,哎，稍微麻烦一点点，但节约你以前花在零碎的copy,paste上的时间.而且我发现管理<br />代码的质量有所提高.</p><p>我们要改进build.xml，让它做更多的事情：</p><p>定义全局变量 <br />初始化,主要是建立目录 <br />编译  (已有) <br />打包为jar <br />建立API documentation <br />生成distribution产品 <br />凡事都讲究平衡，你要ant给你做更多事，当然要累一点点，不过只用累一次，以后的代码修改后的构建都是"一键式"完成,我们制作一个hello的简单例子，你可以自己做j2ee的练习。</p><p>我们要扩充目录结构，使它更像回事：</p><p>ant处理编译之前的目录：</p><p><img onmousewheel="function anonymous()&#xD;&#xA;{&#xD;&#xA;return bbimg(this)&#xD;&#xA;}" 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()&#xD;&#xA;{&#xD;&#xA;java_script_:if(this.width&gt;600)this.width=600&#xD;&#xA;}" border="1" /></p><p>ant处理之后的目录：</p><p><img onmousewheel="function anonymous()&#xD;&#xA;{&#xD;&#xA;return bbimg(this)&#xD;&#xA;}" 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()&#xD;&#xA;{&#xD;&#xA;java_script_:if(this.width&gt;600)this.width=600&#xD;&#xA;}" border="1" /></p><p>图中：\src,\docs,\lib是自己组织的文件结构，\build,\dist是ant动态生成的成品。</p><p>\src                     源文件：java源，script源，jsp源，xml配置.....<br />\src\main         java源<br />\src\script     window,unix,liunx的执行script，我们的简单只有一个：<br />                  run.bat:  java hello.ant.HelloAnt</p><p>\docs                手写说明文档<br />\lib                   程序所需类库的jar,比如j2ee.jar,mail,jar...</p><p>\build               用ant动态生成的构建目录<br />\build\classes  编译的类文件<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 />                              还应copy "\lib"的程序所需jar，这里我们没有。</p><p>以上是我学老外的文件组织，大家可以按照自己的爱好组织</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 软件项目手册docs</p><p><br />--------------------------------------------------------------------------------</p><p>访问api文档</p><p>　  <br />\build.xml 配置文件  <br />S4++++++++++++++++++++++++++++++++++++++++++++++++<br />&lt;?xml version="1.0"  encoding="GB2312" ?&gt;<br />&lt;!--<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 />--&gt;</p><p>&lt;!--<br />    文档结构为:<br />    &lt;project&gt;<br />        &lt;property/&gt;               全局变量的定义<br />        &lt;property/&gt;...</p><p>        &lt;target name="1"&gt;         任务组(tasks)<br />            &lt;javac&gt;&lt;/javac&gt;       一项javac任务<br />            ...<br />            &lt;oneTask&gt;&lt;/ontTask&gt;   一项其它任务<br />        &lt;/target&gt;</p><p>        &lt;target name="2"&gt;<br />            &lt;javac&gt;&lt;/javac&gt;<br />            ...<br />            &lt;oneTask&gt;&lt;/ontTask&gt;<br />        &lt;/target&gt;<br />    &lt;/project&gt;</p><p>    project代表一个项目，<br />    default:运行到名称为"dist"的target(任务组)<br />    basedir:基准路径。<br />--&gt;<br />&lt;project default="dist" basedir="."&gt;</p><p>&lt;!--<br />    ===================================================================<br />      定义属性（property tasks）<br />      最好把用到的路径呀，名称呀都在这里定义成全局变量<br />      例：定义<br />          &lt;property name="a" value="hello"/&gt;<br />      以后就可以这样用它：<br />          &lt;property name="b" value="${a}/b"/&gt;<br />      现在:b=="hello/b"<br />    ===================================================================<br />--&gt;</p><p>    &lt;!--主要的系统环境属性--&gt;<br />    &lt;property environment="env"/&gt;&lt;!--取window,unix...的环境变量--&gt;<br />    &lt;property name="java.home" value="${env.JAVA_HOME}"/&gt;<br />    &lt;property name="ant.home"  value="${env.ANT_HOME}"/&gt;</p><p>    &lt;!--主要的app环境属性--&gt;<br />    &lt;property name="app.name"      value="hello-ant"/&gt;<br />    &lt;property name="app.jar"       value="${app.name}.jar"/&gt;<br />    &lt;property name="app.copyright" value=" Copyright (c) 2002 The Neusoft Software Foundation.  All rights reserved."/&gt;</p><p><br />    &lt;!--app中src的属性--&gt;<br />    &lt;property name="src.dir"    value="src" /&gt;<br />    &lt;property name="src.main"   value="${src.dir}/main"/&gt;<br />    &lt;property name="src.script" value="${src.dir}/script"/&gt;</p><p>    &lt;!--app用到的lib--&gt;<br />    &lt;property name="lib.dir" value="lib"/&gt;</p><p>    &lt;!--app的build目录中--&gt;<br />    &lt;property name="build.dir"      value="build" /&gt;<br />    &lt;property name="build.classes"  value="${build.dir}/classes"/&gt;<br />    &lt;property name="build.docs"     value="${build.dir}/docs"/&gt;<br />    &lt;property name="build.docs.api" value="${build.docs}/api"/&gt;<br />    &lt;property name="build.lib"      value="${build.dir}/lib"/&gt;</p><p>    &lt;!--app的dist (distribution) 目录中--&gt;<br />    &lt;property name="dist.dir"      value="dist"/&gt;<br />    &lt;property name="dist.bin"      value="${dist.dir}/bin"/&gt;<br />    &lt;property name="dist.docs"     value="${dist.dir}/docs"/&gt;<br />    &lt;property name="dist.lib"      value="${dist.dir}/lib"/&gt;</p><p>    &lt;!--app的docs目录中--&gt;<br />    &lt;property name="docs.dir"      value="docs"/&gt;</p><p>    &lt;!--<br />    定义一组路径以后可以通过id重用这组路径 ，例：<br />    &lt;javac srcdir="src/main" destdir="build/classes"&gt;<br />            &lt;classpath refid="classpath"/&gt;<br />    &lt;/javac&gt;<br />    --&gt;<br />    &lt;path id="classpath"&gt;<br />        &lt;!--本项目只有一个java，用不上classpath，这里只是做个例子--&gt;<br />        &lt;pathelement location="${build.classes}"/&gt;<br />        &lt;pathelement path="${java.home}/lib/tools.jar"/&gt;<br />    &lt;/path&gt;</p><p>&lt;!--<br />    ===================================================================<br />      init 准备目录(File Tasks)<br />      主要的目录结构通常是不会变的，一起生成他们<br />    ===================================================================<br />--&gt;<br />    &lt;target name="init"&gt;<br />        &lt;!--清除以前目录--&gt;<br />        &lt;delete dir="${build.dir}" failonerror="false" /&gt;<br />        &lt;delete dir="${dist.dir}"  failonerror="false"/&gt;</p><p>        &lt;!--准备目录--&gt;<br />        &lt;mkdir dir="${build.dir}"/&gt;<br />        &lt;mkdir dir="${build.classes}"/&gt;<br />        &lt;mkdir dir="${build.docs}"/&gt;<br />        &lt;mkdir dir="${build.docs.api}"/&gt;<br />        &lt;mkdir dir="${build.lib}"/&gt;</p><p>        &lt;mkdir dir="${dist.dir}"/&gt;<br />        &lt;mkdir dir="${dist.bin}"/&gt;<br />        &lt;mkdir dir="${dist.lib}"/&gt;</p><p>    &lt;/target&gt;</p><p>&lt;!--<br />    ===================================================================<br />      Build the code (Compile Tasks,File Tasks)<br />    ===================================================================<br />--&gt;<br />    &lt;target name="build" depends="init"&gt;<br />        &lt;!--编译--&gt;<br />        &lt;javac srcdir="${src.main}" destdir="${build.classes}"&gt;<br />            &lt;classpath refid="classpath"/&gt;<br />        &lt;/javac&gt;<br />    &lt;/target&gt;</p><p>&lt;!--<br />    ===================================================================<br />      打包文档(Archive Tasks)<br />      Create the project jars: xxx1.jar and xxx2.jar<br />    ===================================================================<br />--&gt;<br />   &lt;target name="jars" depends="build"&gt;<br />        &lt;jar basedir="${build.classes}" jarfile="${build.lib}/${app.jar}"/&gt;<br />    &lt;/target&gt;</p><p>&lt;!--<br />     ===================================================================<br />       Creates the API documentation<br />     ===================================================================<br />--&gt;<br />    &lt;target name="javadocs"<br />            depends="jars"<br />            description="--&gt; creates the API documentation"&gt;<br />        &lt;!--copy docs 手册... --&gt;<br />        &lt;copy todir="${build.docs}"&gt;<br />            &lt;fileset dir="${docs.dir}"/&gt;<br />        &lt;/copy&gt;</p><p>        &lt;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"&gt;<br />             &lt;doctitle&gt;&lt;![CDATA[&lt;h1&gt;hello ant Docs API&lt;/h1&gt;]]&gt;&lt;/doctitle&gt;<br />             &lt;bottom&gt;&lt;![CDATA[&lt;i&gt;${app.copyright}&lt;/i&gt;]]&gt;&lt;/bottom&gt;<br />             &lt;tag name="todo" scope="all" description="To do:" /&gt;<br />         &lt;/javadoc&gt;<br />    &lt;/target&gt;</p><p>&lt;!--<br />     ===================================================================<br />       Create the distribution that can run (Archive Tasks)<br />       主要是从各目录中把该copy的copy上<br />     ===================================================================<br />--&gt;<br />   &lt;target name="dist" depends="javadocs"&gt;<br />        &lt;!--copy bin 执行文件 --&gt;<br />        &lt;copy todir="${dist.bin}"&gt;<br />            &lt;fileset dir="${src.script}/"/&gt;<br />        &lt;/copy&gt;<br />        &lt;copy todir="${dist.docs}"&gt;<br />            &lt;fileset dir="${build.docs}/"/&gt;<br />        &lt;/copy&gt;<br />        &lt;!-- copy lib 文件 --&gt;<br />        &lt;copy todir="${dist.lib}"&gt;<br />            &lt;fileset dir="${build.lib}/"/&gt;<br />        &lt;/copy&gt;</p><p>    &lt;/target&gt;<br />&lt;!--<br />     ===================================================================<br />      Cleans everything(File Tasks)<br />      例如可以删除build中的文件，留给你发挥吧<br />     ===================================================================<br />--&gt;</p><p>&lt;/project&gt;  </p><p>E4++++++++++++++++++++++++++++++++++++++++++++++</p><p>build.xml多了些，但其实很简单：(注释比较详细可以参照，这里再简单说一下)</p><p>一个build.xml包含一个工程的自动化处理的完整xml说明，并且基本由3种东东组成：</p><p>&lt;project &gt;</p><p>    1.全局变量的定义<br />    &lt;property/&gt;</p><p>    2.任务组<br />    &lt;target&gt;<br />        3.许多单项任务... 像copy,delete,javac,jar...<br />        &lt;task1/&gt;<br />        &lt;task2/&gt;<br />        &lt;task3/&gt;<br />    &lt;/target&gt;</p><p>&lt;/project&gt;</p><p>参考及下载：</p><p>ant最新下载：<br /><a href="http://jakarta.apache.org/ant/index.html">http://jakarta.apache.org/ant/index.html</a></p><p>ant具体的编写方法参考ant手册以下2部分就形，<br /><a href="http://jakarta.apache.org/ant/manual/using">http://jakarta.apache.org/ant/manual/using</a> 使用说明<br /><a href="http://jakarta.apache.org/ant/manual/coretasklist.html">http://jakarta.apache.org/ant/manual/coretasklist.html</a> 核心tasks<br />其他一大堆东西你要看也行。不过我觉得比较浪费时间。<br /><a href="http://jakarta.apache.org/ant/manual/index.html">http://jakarta.apache.org/ant/manual/index.html</a>  手册index</p><p>huihoo.com翻译改编的ant/manual/using<br /><a href="http://www.huihoo.com/java/ant.html">http://www.huihoo.com/java/ant.html</a></p><p>用ANT构造Application作者：余斌斌    <br /><a href="http://developer.ccidnet.com/pub/disp/Article?columnID=295&amp;articleID=27619&amp;pageNO=1">http://developer.ccidnet.com/pub/disp/Article?columnID=295&amp;articleID=27619&amp;pageNO=1</a></p><p>ibm 利用 Ant 和 JUnit 进行增量开发——使用单元测试来逐步改进代码<br /><a href="http://www-900.ibm.com/developerWorks/cn/java/j-ant/index.shtml">http://www-900.ibm.com/developerWorks/cn/java/j-ant/index.shtml</a></p><p>关于作者：</p><p>陈鹏，东软西安公司。作为一名狂热的程序员希望每一天都能成长进步，并希望与大家分享快乐和知识。<br />请用以下方式和他联系：email <a href="mailto:chen56@msn.com">chen56@msn.com</a>  </p><img src ="http://www.blogjava.net/os586/aggbug/75826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-10-18 10:01 <a href="http://www.blogjava.net/os586/archive/2006/10/18/75826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ANT: 一个通用Build.xml模板的建立[转自蚂蚱Blog]</title><link>http://www.blogjava.net/os586/archive/2006/10/18/75819.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Wed, 18 Oct 2006 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/10/18/75819.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/75819.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/10/18/75819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/75819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/75819.html</trackback:ping><description><![CDATA[
		<h2>
				<a id="viewpost1_TitleUrl" href="/maja/archive/2005/08/09/9679.html">建立web应用的 ant build.xml 模板</a>
		</h2>
		<p>一、建立Web应用步骤<br />1、清空临时目录<br />2、建立目录结构<br />3、从vss或cvs中获得源文件<br />4、编译（编译java源文件、copy属性文件和xml等文件、编码转换）<br />5、建立WAR包<br />6、发布<br /><br />二、建立web应用的 build.xml 模板<br /><br />&lt;?xml version="1.0"?&gt;</p>
		<p>&lt;!--<br />  =======================================================================<br />  build file</p>
		<p>    =======================================================================<br />--&gt;<br />&lt;project default="main" basedir="build"&gt;</p>
		<p>  &lt;property name="file.war" value="myapp.war"/&gt;<br /><br />  &lt;property name="dir.jdk" value="c:/jbuilderx/jdk1.4"/&gt;</p>
		<p>  &lt;property name="dir.src" value="src"/&gt;<br />  &lt;property name="dir.classes" value="classes"/&gt;<br />  &lt;property name="dir.lib" value="lib"/&gt;<br />  &lt;property name="dir.web" value="web"/&gt;</p>
		<p>  &lt;property name="vss.login" value="userId,password"/&gt;<br />  &lt;property name="vss.serverPath" value="i:\"/&gt;<br />  &lt;property name="vss.srcPath" value="/myproject/src"/&gt;<br />  &lt;property name="vss.libPath" value="/myproject/lib"/&gt;<br />  &lt;property name="vss.webPath" value="/myproject/webapp"/&gt;</p>
		<p>  &lt;property name="server.ftp.userId" value="ftpuser"/&gt;<br />  &lt;property name="server.ftp.password" value="ftppassword"/&gt;<br />  &lt;property name="server.ftp.serverIp" value="192.168.0.1"/&gt;</p>
		<p>  &lt;path id="project.class.path"&gt;<br />    &lt;pathelement location="${dir.classes}"/&gt;<br /> &lt;pathelement location="${dir.jdk}/jre/lib/rt.jar"/&gt;</p>
		<p>    &lt;fileset dir="${dir.lib}"&gt;<br />        &lt;include name="**/*.jar"/&gt;<br />    &lt;/fileset&gt;<br />  &lt;/path&gt;</p>
		<p>  &lt;target name="clean"&gt;<br />   &lt;delete dir="${dir.src}"/&gt;<br />   &lt;delete dir="${dir.classes}"/&gt;<br />   &lt;delete dir="${dir.lib}"/&gt;<br />  &lt;/target&gt;<br />  <br />  &lt;target name="init" depends="clean"&gt;<br />   &lt;mkdir dir="${dir.src}"/&gt;<br />   &lt;mkdir dir="${dir.classes}"/&gt;<br />   &lt;mkdir dir="${dir.lib}"/&gt;<br />  &lt;/target&gt;</p>
		<p>  &lt;target name="getFromVcm" depends="init"&gt;<br /> &lt;vssget localPath="${dir.src}"<br />  login="${vss.login}"<br />  vsspath="${vss.srcPath}"<br />  recursive="true"<br />  serverPath="${vss.serverPath}"<br />  writable="true"/&gt;</p>
		<p> &lt;vssget localPath="${dir.lib}"<br />  login="${vss.login}"<br />  vsspath="${vss.libPath}"<br />  recursive="true"<br />  serverPath="${vss.serverPath}"<br />  writable="true"/&gt;<br /> <br /> &lt;vssget localPath="${dir.web}"<br />  login="${vss.login}"<br />  vsspath="${vss.webPath}"<br />  recursive="true"<br />  serverPath="${vss.serverPath}"<br />  writable="true"/&gt;<br /> <br />  &lt;/target&gt;</p>
		<p>  &lt;target name="compile" depends="getFromVcm"&gt;<br /> &lt;javac bootclasspathref="project.class.path" debug="true" <br />        deprecation="true" destdir="${dir.classes}" nowarn="false" target="1.2"&gt;<br />      &lt;src path="${dir.src}"/&gt;<br />    &lt;/javac&gt;<br /> &lt;copy todir="${dir.classes}"&gt;<br />   &lt;fileset dir="${dir.src}"&gt;<br />    &lt;include name="**/*.properties"/&gt;<br />      &lt;include name="**/*.xml"/&gt;<br />    &lt;exclude name="ApplicationResources.properties"/&gt;<br />    &lt;/fileset&gt;<br /> &lt;/copy&gt;<br /> &lt;native2ascii encoding="GBK" src="${dir.src}" dest="${dir.classes}"<br />    includes="ApplicationResources.properties"/&gt;<br />  &lt;/target&gt;</p>
		<p>  &lt;target name="buildWar" depends="compile"&gt;<br /> &lt;war destfile="${file.war}" webxml="${dir.web}/WEB-INF/web.xml"&gt;<br />  &lt;lib dir="${dir.lib}"/&gt;<br />  &lt;classes dir="${dir.classes}"/&gt;<br />  &lt;fileset dir="${dir.web}"/&gt;<br /> &lt;/war&gt;<br />  &lt;/target&gt;</p>
		<p>  &lt;target name="deploy" depends="buildWar"&gt;<br />    &lt;ftp server="${server.ftp.serverIp}"<br />    userid="${server.ftp.userId}"<br />       password="${server.ftp.password}"&gt;<br /> &lt;fileset dir="."&gt;<br />      &lt;include name="${file.war}"/&gt;<br />    &lt;/fileset&gt;<br /> &lt;/ftp&gt;<br />  &lt;/target&gt;</p>
		<p>  &lt;target name="main" description="" depends="deploy"/&gt;</p>
		<p>&lt;/project&gt;</p>
<img src ="http://www.blogjava.net/os586/aggbug/75819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-10-18 09:50 <a href="http://www.blogjava.net/os586/archive/2006/10/18/75819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ant: 中文教程二</title><link>http://www.blogjava.net/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.blogjava.net/os586/archive/2006/10/17/75681.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/75681.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/10/17/75681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/75681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/75681.html</trackback:ping><description><![CDATA[
		<p>基本应用 <br /><br /><strong>建立工程的目录 </strong><br /><br />一般要根据工程的实际情况来建立工程的目录结构。但是，有一些比较通用的组织形式可供参考，比如所有的jakarta项目都使用类似的目录结构。下面让我们来看一下这种目录结构的特点。 <br /><br />表1 <br /><br /></p>
		<table bordercolordark="#ffffff" border="1">
				<tbody>
						<tr>
								<td>目录 </td>
								<td>文件 </td>
						</tr>
						<tr>
								<td>bin </td>
								<td>公共的二进制文件，以及运行脚本 </td>
						</tr>
						<tr>
								<td>build </td>
								<td>临时创建的文件，如类文件等 </td>
						</tr>
						<tr>
								<td>dist </td>
								<td>目标输出文件，如生成Jar文件等。 </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 />对于一个简单的工程，一般包括表1的几个目录。其中bin、lib、doc和src目录需要在<a href="http://www.javaresource.org/cvs/cvs-62.html">CVS</a>的控制之下。当然在这样的目录结构上，也可以做一些调整，例如，可以建立一个extra目录来放置需要发布的Jar文件、Inf文件及图像文件等。同样，如果开发Web应用可以建立一个Web目录放置JSP、HTML等文件。 <br /><br />如果我们开发的是一个比较复杂的项目，包括多个子项目，并且各个子项目是由不同的开发人员来完成的，那么要如何来设计它的目录结构？首先有一点是需要确定的，不同的子项目应该拥有不同的Build文件，并且整个项目也应该有一个总的Build文件。可以通过Ant任务或是AntCall任务调用子项目的Build文件，如下例： <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 />在各个子项目的耦合不是非常紧密的情况下，各个子项目应该有各自独立的目录结构，也就是说它们可以有自己的src、doc、build、dist等目录及自己的build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>文件，但是可以共享lib和bin目录。而对于那些耦合紧密的子项目，则推荐使用同一个src目录，但是不同的子项目有不同的子目录，各个子项目的build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>文件可以放在根目录下，也可以移到各个子项目的目录下。 <br /><br /><strong>编写Build文件 </strong><br /><br />要用好Ant工具，关键是要编写一个build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>文件。要编写出一个结构良好、灵活可扩展的Build文件，有两个问题要考虑，一是了解Build文件的基本结构，二是了解Ant定义的大量任务。 <br /><br />Ant的Build文件是一个标准的XML文件，它包含一个根节点Project，每个Project定义了至少一个或多个Target，每个Target又是一系列Task的集合。它们之间的关系如图2所示。 <br /><p align="center"><img height="244" src="http://www.javaresource.org/h000/h13/img200606262025170.gif" width="260" /><br />图2 build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>文件的结构</p><br />每个Task是一段可被执行的代码，比如，前例中的javac、jar就是两个最常用的Task。Ant定义了大量的核心Task，我们要考虑的第二个问题正是如何去掌握这大量的Task。其实唯一的方法就是边学习边实践，这方面最好的参考就是官方的Ant使用手册。 <br /><br /><strong>外部文件的使用 </strong><br /><br />使用外部的Property文件可以保存一些预设置的公共属性变量。这些属性可以在多个不同的Build文件中使用。 <br /><br />可以将一个外部的XML文件导入Build文件中，这样多个项目的开发者可以通过引用来共享一些代码，同样，这也有助于Build文件的重用，示例代码如下所示： <br /><br /><table cellspacing="0"><tbody><tr><td class="code">xml"&gt;<br />xml"&gt;<br />]&gt;<br /><project basedir="." default="complie" name="main"><br />&amp;share-variable;<br />&amp;build-share;<br />... ...</project></td></tr></tbody></table><br /><br />在J2EE项目中的应用 <br /><br />只要掌握了Ant的使用方法，在J2EE项目中的应用与在其它项目中的应用并没有太大的不同，但是仍有几点是需要注意的。 <br /><br />一是要清楚War和Jar文件的目录结构，主要是War的配置文件web.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>文件的位置和EJB的配置文件（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>等）的位置，在调用Jar任务打包文件时一定要记得把它们也包含进来。一般在编译之前就要注意把这些需打包的文件拷入相应目录下。二是在J2EE项目中可能会涉及到一些特殊的任务，比如在Weblogic中会调用ejbc预编译EJB的代码存根，或者需要在Ant中同时发布Jar到相应的服务器中等。可以用两种途径实现这些任务，一是扩展Ant任务实现这些任务，二是直接用Java任务来执行这些命令。下面是打包、发布一个EJB的build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>配置文件片断，代码如下： <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="${&lt;a href=http://www.javaresource.org/weblogic/weblogic.html&gt;weblogic&lt;/a&gt;.deploy.dest}/helloEJB.jar" /><br /><!-- 创建META-INF目录，放置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> 到临时目录--><br /><copy todir="${temp}/ejb_make/META-INF"><br /><fileset dir="etc/baseinfo"><br /><include name="*.&lt;a href=http://www.javaresource.org/xml/xml-55.html&gt;xml&lt;/a&gt;" /><br /></fileset><br /></copy><br /><!-- 拷贝所有的helloEJB类到临时目录 --><br /><copy todir="${temp}/ejb_make/"><br /><fileset dir="${dest.classes}/"><!-- dest.classes是输出的类文件目录 --><br /><include name="${dest.classes}/helloEJB/**" /><br /></fileset><br /></copy><br /><!-- 将所有这些文件打包成helloEJB.jar --><br /><jar basedir="${temp}/ejb_make" jarfile="${temp}/helloEJB.jar" /><br /><!-- 进行<a href=http://www.javaresource.org/weblogic/weblogic.html>weblogic</a>.ejbc编译 --><br /><java classname="&lt;a href=http://www.javaresource.org/weblogic/weblogic.html&gt;weblogic&lt;/a&gt;.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="${&lt;a href=http://www.javaresource.org/weblogic/weblogic.html&gt;weblogic&lt;/a&gt;.deploy.dest}" /><br /></target></td></tr></tbody></table><br /><br />用Ant配合JUnit实现单元测试 <br /><br />Ant 提供了JUnit任务,可以执行单元测试代码。如何使用JUnit，以及如何编写测试用例(TestCase)，感兴趣的读者可以参阅JUnit的相关文档。在Ant中使用JUnit的方法非常简单，首先需要把junit.jar拷入ANT_HOME\lib下，确认在这个目录下有optional.jar，因为JUnit是Ant的扩展任务，需要引用这个扩展包。然后就是在Build文件中加入JUnit的任务，代码如下： <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.&lt;a href=">antdemo.HelloWorldTest" /&gt;<br /></test></junit><br /></target></td></tr></tbody></table><br /><br />高级话题 <br /><br /><strong>为Ant开发扩展任务 </strong><br /><br />为Ant实现扩展任务其实是非常容易的，只需按照以下几个步骤即可： <br /><br />1. 创建一个Java类继承org.apache.tools.<a href="http://www.javaresource.org/ant/ant-57.html"><font color="#0000ff">ant</font></a>.Task类； <br /><br />2. 对每个属性实现set方法。Ant会根据需要自动完成类型转换； <br /><br />3. 如果扩展的任务需要嵌套其它的Task，那么这个Java类必需实现接口org.apache.tools.<a href="http://www.javaresource.org/ant/ant-57.html"><font color="#0000ff">ant</font></a>.TaskContainer； <br /><br />4. 如果扩展的任务要支持Text，需要增加一个方法void addText(String)； <br /><br />5. 对每个嵌套的元素，实现create、add 或 addConfigured 方法； <br /><br />6. 实现public void execute方法； <br /><br />7. 在build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>文件中使用 <taskdef>来引用自定义的Task。 <br /><br />下面以一个简单的例子来说明如何为Ant增加一个hello任务，它可以连续打印多条信息，打印的次数由属性count指定，而打印的内容则由它内嵌的一个helloinfo任务的message属性指定，看上去这非常类似JSP中自定义标签的一些概念，实现代码如下： <br /><br /><table cellspacing="0"><tbody><tr><td class="code">//HelloInfoTask.java<br />package com.sharetop.<a href="http://www.javaresource.org/ant/ant-57.html"><font color="#0000ff">ant</font></a>demo;<br />import org.apache.tools.<a href="http://www.javaresource.org/ant/ant-57.html"><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 />下面是外部Task类的代码： <br /><br /><table cellspacing="0" width="365"><tbody><tr><td class="code" width="361">//HelloTask.java<br />package com.sharetop.<a href="http://www.javaresource.org/ant/ant-57.html"><font color="#0000ff">ant</font></a>demo;<br />import org.apache.tools.<a href="http://www.javaresource.org/ant/ant-57.html"><font color="#0000ff">ant</font></a>.*;<br />public class HelloTask extends Task implements org.apache.tools.<a href="http://www.javaresource.org/ant/ant-57.html"><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 />实现了这两个Task，在build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>文件中定义它的task name，就可以在Target中执行它了。如果你不想使用 <taskdef>标签来定义Task，也可以通过修改default.properties文件来实现引入新Task，这个文件位于org.apache.tools.<a href="http://www.javaresource.org/ant/ant-57.html"><font color="#0000ff">ant</font></a>.taskdefs 包里。下例是一个使用 标签来引入新Task的Build文件部分： <br /><br /><table cellspacing="0"><tbody><tr><td class="code"><target name="hello" depends="client"><br /><taskdef name="hello"><br />classname="com.sharetop.<a href="http://www.javaresource.org/ant/ant-57.html"><font color="#0000ff">ant</font></a>demo.HelloTask" classpath="client.jar"/&gt;<br /><taskdef name="helloinfo"><br />classname="com.sharetop.<a href="http://www.javaresource.org/ant/ant-57.html"><font color="#0000ff">ant</font></a>demo.HelloInfoTask" classpath="client.jar"/&gt;<br /><hello count="3"><br /><helloinfo message="hello world" /><br /></hello><br /></taskdef></taskdef></target></td></tr></tbody></table>（未完待续） <br /></taskdef></taskdef><img src ="http://www.blogjava.net/os586/aggbug/75681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-10-17 16:30 <a href="http://www.blogjava.net/os586/archive/2006/10/17/75681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ant: 中文教程一</title><link>http://www.blogjava.net/os586/archive/2006/10/17/75680.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Tue, 17 Oct 2006 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/10/17/75680.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/75680.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/10/17/75680.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/75680.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/75680.html</trackback:ping><description><![CDATA[Error convertoring HTML to XHTML: System.ArgumentException: Invalid name character in '<a'.
   at System.Xml.XmlTextWriter.ValidateName(String name, Boolean NCName)
   at System.Xml.XmlTextWriter.InternalWriteProcessingInstruction(String name, String text)
   at System.Xml.XmlTextWriter.WriteProcessingInstruction(String name, String text)
   at System.Xml.XmlWriter.WriteNode(XmlReader reader, Boolean defattr)
   at FreeTextBoxControls.Support.Formatter.HtmlToXhtml(String input)<img src ="http://www.blogjava.net/os586/aggbug/75680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-10-17 16:29 <a href="http://www.blogjava.net/os586/archive/2006/10/17/75680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ant:  中文教程</title><link>http://www.blogjava.net/os586/archive/2006/10/17/75678.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Tue, 17 Oct 2006 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/10/17/75678.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/75678.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/10/17/75678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/75678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/75678.html</trackback:ping><description><![CDATA[
		<table height="130" cellpadding="5" width="130" align="left">
				<tbody>
						<tr>
								<td style="PADDING-BOTTOM: 10px; WIDTH: 130px; HEIGHT: 130px">
										<script type="text/javascript">
												<!--
google_ad_client = "pub-2638910793897145";
google_ad_width = 125;
google_ad_height = 125;
google_ad_format = "125x125_as_rimg";
google_cpa_choice = "CAAQlLeU_AEaCMOz4xdgS_KKKMj19IMB";
//-->
										</script>
										<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
										</script>
								</td>
						</tr>
				</tbody>
		</table>还不是很全，只有基本的内容：<br />1 Ant是什么？ <br />Apache Ant 是一个基于 Java的生成工具。<br />生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式（也有可能转换为可安装的产品映像形式）。随着应用程序的生成过程变得更加复杂，确保在每次生成期间都使用精确相同的生成步骤，同时实现尽可能多的自动化，以便及时产生一致的生成版本<br />2 下载、安装Ant <br />安装Ant<br />下载.zip文件，解压缩到c:\<a href="http://www.javaresource.org/ant/ant-57.html">ant</a>1.3(后面引用为%ANT_HOME%)<br /><br />2.1 在你运行Ant之前需要做一些配置工作。<br />? 将bin目录加入PATH环境变量。 <br />? 设定ANT_HOME环境变量，指向你安装Ant的目录。在一些OS上，Ant的脚本可以猜测ANT_HOME（Unix和Windos NT/2000）－但最好不要依赖这一特性。 <br />? 可选地，设定JAVA_HOME环境变量（参考下面的高级小节），该变量应该指向你安装JDK的目录。<br />注意：不要将Ant的<a href="http://www.javaresource.org/ant/ant-57.html">ant</a>.jar文件放到JDK/JRE的lib/ext目录下。Ant是个应用程序，而lib/ext目录是为JDK扩展使用的（如JCE，JSSE扩展）。而且通过扩展装入的类会有安全方面的限制。<br />2.2 运行Ant <br /><br />运行Ant非常简单，当你正确地安装Ant后，只要输入<a href="http://www.javaresource.org/ant/ant-57.html">ant</a>就可以了。<br /><br />? 没有指定任何参数时，Ant会在当前目录下查询build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>文件。如果找到了就用该文件作为buildfile。如果你用 -find 选项。Ant就会在上级目录中寻找buildfile，直至到达文件系统的根。要想让Ant使用其他的buildfile，可以用参数 -buildfile file，这里file指定了你想使用的buildfile。<br /><br />? 可以指定执行一个或多个target。当省略target时，Ant使用标签&lt;project&gt;的default属性所指定的target。<br /><br /><br />命令行选项总结：<br /><a href="http://www.javaresource.org/ant/ant-57.html">ant</a> [options] [target [target2 [target3] ...]]<br />Options:<br />-help print this message<br />-projecthelp print project help information<br />-version print the version information and exit<br />-quiet be extra quiet<br />-verbose be extra verbose<br />-debug print debugging information<br />-emacs produce logging information without adornments<br />-logfile file use given file for log output<br />-logger classname the class that is to perform logging<br />-listener classname add an instance of class as a project listener<br />-buildfile file use specified buildfile<br />-find file search for buildfile towards the root of the filesystem and use the first one found<br />-Dproperty=value set property to value <br />例子<br /><a href="http://www.javaresource.org/ant/ant-57.html">ant</a><br />使用当前目录下的build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>运行Ant，执行缺省的target。<br /><a href="http://www.javaresource.org/ant/ant-57.html">ant</a> -buildfile test.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a><br />使用当前目录下的test.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>运行Ant，执行缺省的target。<br /><a href="http://www.javaresource.org/ant/ant-57.html">ant</a> -buildfile test.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a> dist<br />使用当前目录下的test.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>运行Ant，执行一个叫做dist的target。<br /><a href="http://www.javaresource.org/ant/ant-57.html">ant</a> -buildfile test.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a> -Dbuild=build/classes dist<br />使用当前目录下的test.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>运行Ant，执行一个叫做dist的target，并设定build属性的值为build/classes。<br /><br />3 编写build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a><br /><br />Ant的buildfile是用XML写的。每个buildfile含有一个project。<br /><br />buildfile中每个task元素可以有一个id属性，可以用这个id值引用指定的任务。这个值必须是唯一的。（详情请参考下面的Task小节）<br /><br />3.1 Projects<br /><br />project有下面的属性：<br />Attribute Description Required<br />name 项目名称. No<br />default 当没有指定target时使用的缺省target Yes<br />basedir 用于计算所有其他路径的基路径。该属性可以被basedir property覆盖。当覆盖时，该属性被忽略。如果属性和basedir property都没有设定，就使用buildfile文件的父目录。 No<br />项目的描述以一个顶级的&lt;description&gt;元素的形式出现（参看description小节）。<br /><br />一个项目可以定义一个或多个target。一个target是一系列你想要执行的。执行Ant时，你可以选择执行那个target。当没有给定target时，使用project的default属性所确定的target。<br /><br />3.2 Targets<br /><br />一个target可以依赖于其他的target。例如，你可能会有一个target用于编译程序，一个target用于生成可执行文件。你在生成可执行文件之前必须先编译通过，所以生成可执行文件的target依赖于编译target。Ant会处理这种依赖关系。<br /><br />然而，应当注意到，Ant的depends属性只指定了target应该被执行的顺序－如果被依赖的target无法运行，这种depends对于指定了依赖关系的target就没有影响。<br /><br />Ant会依照depends属性中target出现的顺序（从左到右）依次执行每个target。然而，要记住的是只要某个target依赖于一个target，后者就会被先执行。<br />&lt;target name="A"/&gt;<br />&lt;target name="B" depends="A"/&gt;<br />&lt;target name="C" depends="B"/&gt;<br />&lt;target name="D" depends="C,B,A"/&gt;<br />假定我们要执行target D。从它的依赖属性来看，你可能认为先执行C，然后B，最后A被执行。错了，C依赖于B，B依赖于A，所以先执行A，然后B，然后C，最后D被执行。<br /><br />一个target只能被执行一次，即时有多个target依赖于它（看上面的例子）。<br /><br />如果（或如果不）某些属性被设定，才执行某个target。这样，允许根据系统的状态（java version, OS, 命令行属性定义等等）来更好地控制build的过程。要想让一个target这样做，你就应该在target元素中，加入if（或unless）属性，带上target因该有所判断的属性。例如：<br />&lt;target name="build-module-A" if="module-A-present"/&gt;<br />&lt;target name="build-own-fake-module-A" unless="module-A-present"/&gt;<br />如果没有if或unless属性，target总会被执行。<br /><br />可选的description属性可用来提供关于target的一行描述，这些描述可由-projecthelp命令行选项输出。<br /><br />将你的tstamp task在一个所谓的初始化target是很好的做法，其他的target依赖这个初始化target。要确保初始化target是出现在其他target依赖表中的第一个target。在本手册中大多数的初始化target的名字是"init"。<br /><br />target有下面的属性：<br />Attribute Description Required<br />name target的名字 Yes<br />depends 用逗号分隔的target的名字列表，也就是依赖表。 No<br />if 执行target所需要设定的属性名。 No<br />unless 执行target需要清除设定的属性名。 No<br />description 关于target功能的简短描述。 No<br /><br />3.3 Tasks<br /><br />一个task是一段可执行的代码。<br /><br />一个task可以有多个属性（如果你愿意的话，可以将其称之为变量）。属性只可能包含对property的引用。这些引用会在task执行前被解析。<br /><br />下面是Task的一般构造形式：<br />&lt;name attribute1="value1" attribute2="value2" ... /&gt;<br />这里name是task的名字，attributeN是属性名，valueN是属性值。<br /><br />有一套内置的（built-in）task，以及一些可选task，但你也可以编写自己的task。<br /><br />所有的task都有一个task名字属性。Ant用属性值来产生日志信息。<br /><br />可以给task赋一个id属性：<br />&lt;taskname id="taskID" ... /&gt;<br />这里taskname是task的名字，而taskID是这个task的唯一标识符。通过这个标识符，你可以在脚本中引用相应的task。例如，在脚本中你可以这样：<br />&lt;script ... &gt;<br />task1.setFoo("bar");<br />&lt;/script&gt;<br />设定某个task实例的foo属性。在另一个task中（用java编写），你可以利用下面的语句存取相应的实例。<br />project.getReference("task1").<br />注意1：如果task1还没有运行，就不会被生效（例如：不设定属性），如果你在随后配置它，你所作的一切都会被覆盖。<br /><br />注意2：未来的Ant版本可能不会兼容这里所提的属性，因为很有可能根本没有task实例，只有proxies。<br /><br />3.4 Properties<br /><br />一个project可以有很多的properties。可以在buildfile中用property task来设定，或在Ant之外设定。一个property有一个名字和一个值。property可用于task的属性值。这是通过将属性名放在"${"和"}"之间并放在属性值的位置来实现的。例如如果有一个property builddir的值是"build"，这个property就可用于属性值：${builddir}/classes。这个值就可被解析为build/classes。<br /><br />内置属性<br /><br />如果你使用了&lt;property&gt; task 定义了所有的系统属性，Ant允许你使用这些属性。例如，${os.name}对应操作系统的名字。<br /><br />要想得到系统属性的列表可参考the Javadoc of System.getProperties。<br /><br />除了Java的系统属性，Ant还定义了一些自己的内置属性： <br />basedir project基目录的绝对路径 (与&lt;project&gt;的basedir属性一样)。<br /><a href="http://www.javaresource.org/ant/ant-57.html">ant</a>.file buildfile的绝对路径。<br /><a href="http://www.javaresource.org/ant/ant-57.html">ant</a>.version Ant的版本。<br /><a href="http://www.javaresource.org/ant/ant-57.html">ant</a>.project.name 当前执行的project的名字；由&lt;project&gt;的name属性设定.<br /><a href="http://www.javaresource.org/ant/ant-57.html">ant</a>.java.version Ant检测到的JVM的版本； 目前的值有"1.1", "1.2", "1.3" and "1.4".<br /><br />例子<br />&lt;project name="MyProject" default="dist" basedir="."&gt; <br /><br />&lt;!-- set global properties for this build --&gt;<br />&lt;property name="src" value="."/&gt;<br />&lt;property name="build" value="build"/&gt;<br />&lt;property name="dist" value="dist"/&gt; <br /><br />&lt;target name="init"&gt;<br />&lt;!-- Create the time stamp --&gt;<br />&lt;tstamp/&gt;<br />&lt;!-- Create the build directory structure used by compile --&gt;<br />&lt;mkdir dir="${build}"/&gt;<br />&lt;/target&gt;<br /><br />&lt;target name="compile" depends="init"&gt;<br />&lt;!-- Compile the java code from ${src} into ${build} --&gt;<br />&lt;javac srcdir="${src}" destdir="${build}"/&gt;<br />&lt;/target&gt;<br /><br />&lt;target name="dist" depends="compile"&gt;<br />&lt;!-- Create the distribution directory --&gt;<br />&lt;mkdir dir="${dist}/lib"/&gt;<br />&lt;!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --&gt;<br />&lt;jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/&gt;<br />&lt;/target&gt;<br /><br />&lt;target name="clean"&gt;<br />&lt;!-- Delete the ${build} and ${dist} directory trees --&gt;<br />&lt;delete dir="${build}"/&gt;<br />&lt;delete dir="${dist}"/&gt;<br />&lt;/target&gt;<br /><br />&lt;/project&gt;<br />3.5 Path-like Structures<br />你可以用":"和";"作为分隔符，指定类似PATH和CLASSPATH的引用。Ant会把分隔符转换为当前系统所用的分隔符。<br /><br />当需要指定类似路径的值时，可以使用嵌套元素。一般的形式是<br />&lt;classpath&gt;<br />&lt;pathelement path="${classpath}"/&gt;<br />&lt;pathelement location="lib/helper.jar"/&gt;<br />&lt;/classpath&gt;<br />location属性指定了相对于project基目录的一个文件和目录，而path属性接受逗号或分号分隔的一个位置列表。path属性一般用作预定义的路径－－其他情况下，应该用多个location属性。<br /><br />为简洁起见，classpath标签支持自己的path和location属性。所以：<br />&lt;classpath&gt;<br />&lt;pathelement path="${classpath}"/&gt;<br />&lt;/classpath&gt;<br />可以被简写作：<br />&lt;classpath path="${classpath}"/&gt;<br />也可通过&lt;fileset&gt;元素指定路径。构成一个fileset的多个文件加入path-like structure的顺序是未定的。<br />&lt;classpath&gt;<br />&lt;pathelement path="${classpath}"/&gt;<br />&lt;fileset dir="lib"&gt;<br />&lt;include name="**/*.jar"/&gt;<br />&lt;/fileset&gt;<br />&lt;pathelement location="classes"/&gt;<br />&lt;/classpath&gt;<br />上面的例子构造了一个路径值包括：${classpath}的路径，跟着lib目录下的所有jar文件，接着是classes目录。<br /><br />如果你想在多个task中使用相同的path-like structure，你可以用&lt;path&gt;元素定义他们（与target同级），然后通过id属性引用－－参考Referencs例子。<br /><br />path-like structure可能包括对另一个path-like structurede的引用（通过嵌套&lt;path&gt;元素）：<br />&lt;path id="base.path"&gt;<br />&lt;pathelement path="${classpath}"/&gt;<br />&lt;fileset dir="lib"&gt;<br />&lt;include name="**/*.jar"/&gt;<br />&lt;/fileset&gt;<br />&lt;pathelement location="classes"/&gt;<br />&lt;/path&gt;<br />&lt;path id="tests.path"&gt;<br />&lt;path refid="base.path"/&gt;<br />&lt;pathelement location="testclasses"/&gt;<br />&lt;/path&gt;<br />前面所提的关于&lt;classpath&gt;的简洁写法对于&lt;path&gt;也是有效的，如：<br />&lt;path id="tests.path"&gt;<br />&lt;path refid="base.path"/&gt;<br />&lt;pathelement location="testclasses"/&gt;<br />&lt;/path&gt;<br />可写成：<br />&lt;path id="base.path" path="${classpath}"/&gt;<br />命令行变量<br /><br />有些task可接受参数，并将其传递给另一个进程。为了能在变量中包含空格字符，可使用嵌套的arg元素。<br />Attribute Description Required<br />value 一个命令行变量；可包含空格字符。 只能用一个<br />line 空格分隔的命令行变量列表。 <br />file 作为命令行变量的文件名；会被文件的绝对名替代。 <br />path 一个作为单个命令行变量的path-like的字符串；或作为分隔符，Ant会将其转变为特定平台的分隔符。 <br /><br />例子<br />&lt;arg value="-l -a"/&gt;<br />是一个含有空格的单个的命令行变量。<br />&lt;arg line="-l -a"/&gt;<br />是两个空格分隔的命令行变量。<br />&lt;arg path="/dir;/dir2:\dir3"/&gt;<br />是一个命令行变量，其值在DOS系统上为\dir;\dir2;\dir3；在Unix系统上为/dir:/dir2:/dir3 。<br /><br />References<br /><br />buildfile元素的id属性可用来引用这些元素。如果你需要一遍遍的复制相同的XML代码块，这一属性就很有用－－如多次使用&lt;classpath&gt;结构。<br /><br />下面的例子：<br />&lt;project ... &gt;<br />&lt;target ... &gt; <br />&lt;rmic ...&gt; <br />&lt;classpath&gt; <br />&lt;pathelement location="lib/"/&gt; <br />&lt;pathelement path="${java.class.path}/"/&gt; <br />&lt;pathelement path="${additional.path}"/&gt; <br />&lt;/classpath&gt; <br />&lt;/rmic&gt; <br />&lt;/target&gt;<br />&lt;target ... &gt;<br />&lt;javac ...&gt;<br />&lt;classpath&gt;<br />&lt;pathelement location="lib/"/&gt;<br />&lt;pathelement path="${java.class.path}/"/&gt;<br />&lt;pathelement path="${additional.path}"/&gt;<br />&lt;/classpath&gt;<br />&lt;/javac&gt;<br />&lt;/target&gt;<br />&lt;/project&gt;<br />可以写成如下形式：<br />&lt;project ... &gt; <br />&lt;path id="project.class.path"&gt; <br />&lt;pathelement location="lib/"/&gt;<br />&lt;pathelement path="${java.class.path}/"/&gt; <br />&lt;pathelement path="${additional.path}"/&gt; <br />&lt;/path&gt;<br />&lt;target ... &gt;<br />&lt;rmic ...&gt;<br />&lt;classpath refid="project.class.path"/&gt;<br />&lt;/rmic&gt;<br />&lt;/target&gt;<br />&lt;target ... &gt; <br />&lt;javac ...&gt;<br />&lt;classpath refid="project.class.path"/&gt;<br />&lt;/javac&gt;<br />&lt;/target&gt;<br />&lt;/project&gt;<br />所有使用PatternSets, FileSets 或 path-like structures嵌套元素的task也接受这种类型的引用。<br /><br /><br /><br />4.1 File（Directory）类<br />4.1.1 Mkdir<br />? 创建一个目录，如果他的父目录不存在，也会被同时创建。<br />? 例子：<br />&lt;mkdir dir="build/classes"/&gt;<br />? 说明： 如果build不存在，也会被同时创建<br />4.1.2 Copy<br />? 拷贝一个（组）文件、目录<br />? 例子：<br />1. 拷贝单个的文件： <br />&lt;copy file="myfile.txt" tofile="mycopy.txt"/&gt;<br />2. 拷贝单个的文件到指定目录下<br />&lt;copy file="myfile.txt" todir="../some/other/dir"/&gt;<br />3. 拷贝一个目录到另外一个目录下<br />&lt;copy todir="../new/dir"&gt;<br />&lt;fileset dir="src_dir"/&gt;<br />&lt;/copy&gt;<br />4. 拷贝一批文件到指定目录下<br />&lt;copy todir="../dest/dir"&gt;<br />&lt;fileset dir="src_dir"&gt;<br />&lt;exclude name="**/*.java"/&gt;<br />&lt;/fileset&gt;<br />&lt;/copy&gt;<br /><br />&lt;copy todir="../dest/dir"&gt;<br />&lt;fileset dir="src_dir" excludes="**/*.java"/&gt;<br />&lt;/copy&gt;<br />5. 拷贝一批文件到指定目录下，将文件名后增加。Bak后缀<br />&lt;copy todir="../backup/dir"&gt;<br />&lt;fileset dir="src_dir"/&gt;<br />&lt;mapper type="glob" from="*" to="*.bak"/&gt;<br />&lt;/copy&gt;<br />6. 拷贝一组文件到指定目录下，替换其中的@标签@内容<br />&lt;copy todir="../backup/dir"&gt;<br />&lt;fileset dir="src_dir"/&gt;<br />&lt;filterset&gt;<br />&lt;filter token="TITLE" value="Foo Bar"/&gt;<br />&lt;/filterset&gt;<br />&lt;/copy&gt;<br />4.1.3 Delete<br />? 删除一个（组）文件或者目录<br />? 例子<br />1. 删除一个文件<br />&lt;delete file="/lib/<a href="http://www.javaresource.org/ant/ant-57.html">ant</a>.jar"/&gt;<br />2. 删除指定目录及其子目录<br />&lt;delete dir="lib"/&gt;<br />3. 删除指定的一组文件<br />&lt;delete&gt;<br />&lt;fileset dir="." includes="**/*.bak"/&gt;<br />&lt;/delete&gt;<br />4. 删除指定目录及其子目录，包括他自己<br />&lt;delete includeEmptyDirs="true"&gt;<br />&lt;fileset dir="build"/&gt;<br />&lt;/delete&gt;<br />4.1.4 Move<br />? 移动或重命名一个（组）文件、目录<br />? 例子：<br />1. 移动或重命名一个文件<br />&lt;move file="file.orig" tofile="file.moved"/&gt;<br />2. 移动或重命名一个文件到另一个文件夹下面<br />&lt;move file="file.orig" todir="dir/to/move/to"/&gt;<br />3. 将一个目录移到另外一个目录下<br />&lt;move todir="new/dir/to/move/to"&gt;<br />&lt;fileset dir="src/dir"/&gt;<br />&lt;/move&gt;<br />4. 将一组文件移动到另外的目录下<br />&lt;move todir="some/new/dir"&gt;<br />&lt;fileset dir="my/src/dir"&gt;<br />&lt;include name="**/*.jar"/&gt;<br />&lt;exclude name="**/<a href="http://www.javaresource.org/ant/ant-57.html">ant</a>.jar"/&gt;<br />&lt;/fileset&gt;<br />&lt;/move&gt;<br />5. 移动文件过程中增加。Bak后缀<br />&lt;move todir="my/src/dir"&gt;<br />&lt;fileset dir="my/src/dir"&gt;<br />&lt;exclude name="**/*.bak"/&gt;<br />&lt;/fileset&gt;<br />&lt;mapper type="glob" from="*" to="*.bak"/&gt;<br />&lt;/move&gt;<br /><br /><br /><br /><br />4.2 Java相关<br />4.2.1 Javac<br />? 编译java原代码<br />? 例子<br />1. &lt;javac srcdir="${src}"<br />destdir="${build}"<br />classpath="xyz.jar"<br />debug="on"<br />/&gt;<br />编译${src}目录及其子目录下的所有。Java文件，。Class文件将放在$｛build｝指定的目录下，classpath表示需要用到的类文件或者目录，debug设置为on表示输出debug信息<br />2. &lt;javac srcdir="${src}:${src2}"<br />destdir="${build}"<br />includes="mypackage/p1/**,mypackage/p2/**"<br />excludes="mypackage/p1/testpackage/**"<br />classpath="xyz.jar"<br />debug="on"<br />/&gt;<br />编译${src}和${src2}目录及其子目录下的所有。Java文件，但是package/p1/**,mypackage/p2/**将被编译，而mypackage/p1/testpackage/**将不会被编译。Class文件将放在$｛build｝指定的目录下，classpath表示需要用到的类文件或者目录，debug设置为on表示输出debug信息<br />3. &lt;property name="classpath" value=".;./<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>-apis.jar;../lib/xbean.jar;./easypo.jar"/&gt;<br /><br />&lt;javac srcdir="${src}"<br />destdir="${src}"<br />classpath="${classpath}"<br />debug="on"<br />/&gt;<br />路径是在property中定义的<br />4.2.2 java<br />? 执行指定的java类<br /><br /><br />? 例子：<br />1. &lt;java classname="test.Main"&gt;<br />&lt;classpath&gt;<br />&lt;pathelement location="dist/test.jar"/&gt;<br />&lt;pathelement path="${java.class.path}"/&gt;<br />&lt;/classpath&gt;<br />&lt;/java&gt;<br />classname中指定要执行的类，classpath设定要使用的环境变量<br />2. &lt;path id="project.class.path"&gt;<br />&lt;pathelement location="lib/"/&gt;<br />&lt;pathelement path="${java.class.path}/"/&gt;<br />&lt;pathelement path="${additional.path}"/&gt;<br />&lt;/path&gt;<br /><br />&lt;target ... &gt;<br />&lt;rmic ...&gt;<br />&lt;classpath refid="project.class.path"/&gt;<br />&lt;/rmic&gt;<br />&lt;/target&gt;<br /><br /><br /><br /><br /><br />4.3 打包相关<br />4.3.1 jar<br />? 将一组文件打包<br />? 例子：<br />1. &lt;jar destfile="${dist}/lib/app.jar" basedir="${build}/classes"/&gt;<br />将${build}/classes下面的所有文件打包到${dist}/lib/app.jar中<br />2. &lt;jar destfile="${dist}/lib/app.jar"<br />basedir="${build}/classes"<br />includes="mypackage/test/**"<br />excludes="**/Test.class"<br />/&gt;<br />将${build}/classes下面的所有文件打包到${dist}/lib/app.jar中，但是包括mypackage/test／所有文件不包括所有的Test.class<br />3. &lt;jar destfile="${dist}/lib/app.jar"<br />basedir="${build}/classes"<br />includes="mypackage/test/**"<br />excludes="**/Test.class"<br />manifest=”my.mf”<br />/&gt;<br />manifest属性指定自己的META-INF/MANIFEST.MF文件，而不是由系统生成<br />4.3.2 war<br />? 对Jar的扩展，用于打包Web应用<br />? 例子：<br />? 假设我们的文件目录如下：<br />thirdparty/libs/<a href="http://www.javaresource.org/jdbc-drivers/jdbc-drivers-74.html">jdbc</a>1.jar<br />thirdparty/libs/<a href="http://www.javaresource.org/jdbc-drivers/jdbc-drivers-74.html">jdbc</a>2.jar<br />build/main/com/myco/myapp/Servlet.class<br />src/metadata/myapp.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a><br />src/html/myapp/index.html<br />src/jsp/myapp/front.jsp<br />src/graphics/images/gifs/small/logo.gif<br />src/graphics/images/gifs/large/logo.gif<br />? 下面是我们的任务的内容： <br />&lt;war destfile="myapp.war" web<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>="src/metadata/myapp.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>"&gt;<br />&lt;fileset dir="src/html/myapp"/&gt;<br />&lt;fileset dir="src/jsp/myapp"/&gt;<br />&lt;lib dir="thirdparty/libs"&gt;<br />&lt;exclude name="<a href="http://www.javaresource.org/jdbc-drivers/jdbc-drivers-74.html">jdbc</a>1.jar"/&gt;<br />&lt;/lib&gt;<br />&lt;classes dir="build/main"/&gt;<br />&lt;zipfileset dir="src/graphics/images/gifs" <br />prefix="images"/&gt;<br />&lt;/war&gt;<br />? 完成后的结果：<br />WEB-INF/web.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a><br />WEB-INF/lib/<a href="http://www.javaresource.org/jdbc-drivers/jdbc-drivers-74.html">jdbc</a>2.jar<br />WEB-INF/classes/com/myco/myapp/Servlet.class<br />META-INF/MANIFEST.MF<br />index.html<br />front.jsp<br />images/small/logo.gif<br />images/large/logo.gif<br />4.3.3 ear<br />? 用于打包企业应用<br />? 例子<br />&lt;ear destfile="${build.dir}/myapp.ear" app<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>="${src.dir}/metadata/application.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>"&gt;<br />&lt;fileset dir="${build.dir}" includes="*.jar,*.war"/&gt;<br />&lt;/ear&gt;<br /><br /><br /><br />4.4 时间戳<br />在生成环境中使用当前时间和日期，以某种方式标记某个生成任务的输出，以便记录它是何时生成的，这经常是可取的。这可能涉及编辑一个文件，以便插入一个字符串来指定日期和时间，或将这个信息合并到 JAR 或 zip 文件的文件名中。<br />这种需要是通过简单但是非常有用的 tstamp 任务来解决的。这个任务通常在某次生成过程开始时调用，比如在一个 init 目标中。这个任务不需要属性，许多情况下只需 &lt;tstamp/&gt; 就足够了。<br />tstamp 不产生任何输出；相反，它根据当前系统时间和日期设置 Ant 属性。下面是 tstamp 设置的一些属性、对每个属性的说明，以及这些属性可被设置到的值的例子：<br />属性 说明 例子 <br />DSTAMP 设置为当前日期，默认格式为yyyymmdd 20031217<br />TSTAMP 设置为当前时间，默认格式为 hhmm 1603<br />TODAY 设置为当前日期，带完整的月份 2003 年 12 月 17 日<br />例如，在前一小节中，我们按如下方式创建了一个 JAR 文件：<br /><br />&lt;jar destfile="package.jar" basedir="classes"/&gt;<br /><br />在调用 tstamp 任务之后，我们能够根据日期命名该 JAR 文件，如下所示：<br /><br />&lt;jar destfile="package-${DSTAMP}.jar" basedir="classes"/&gt;<br /><br />因此，如果这个任务在 2003 年 12 月 17 日调用，该 JAR 文件将被命名为 package-20031217.jar。<br />还可以配置 tstamp 任务来设置不同的属性，应用一个当前时间之前或之后的时间偏移，或以不同的方式格式化该字符串。所有这些都是使用一个嵌套的 format 元素来完成的，如下所示：<br /><br />&lt;tstamp&gt;<br />&lt;format property="OFFSET_TIME"<br />pattern="HH:mm:ss"<br />offset="10" unit="minute"/&gt;<br />&lt;/tstamp&gt;<br /><br />上面的清单将 OFFSET_TIME 属性设置为距离当前时间 10 分钟之后的小时数、分钟数和秒数。<br />用于定义格式字符串的字符与 java.text.SimpleDateFormat 类所定义的那些格式字符相同<br /><br /><br /><br />4.5 执行SQL语句<br />? 通过<a href="http://www.javaresource.org/jdbc-drivers/jdbc-drivers-74.html">jdbc</a>执行SQL语句<br />? 例子：<br />1. &lt;sql<br />driver="org.gjt.mm.mysql.Driver"<br />url="<a href="http://www.javaresource.org/jdbc-drivers/jdbc-drivers-74.html">jdbc</a>:mysql://localhost:3306/mydb"<br />userid="root"<br />password="root"<br />src="data.sql"<br />/&gt;<br />2. &lt;sql<br />driver="org.database.<a href="http://www.javaresource.org/jdbc-drivers/jdbc-drivers-74.html">jdbc</a>Driver"<br />url="<a href="http://www.javaresource.org/jdbc-drivers/jdbc-drivers-74.html">jdbc</a>:database-url"<br />userid="sa"<br />password="pass"<br />src="data.sql"<br />rdbms="oracle"<br />version="8.1."<br />&gt;<br />&lt;/sql&gt;<br />只有在oracle、版本是8.1的时候才执行<br /><br /><br /><br />4.6 发送邮件<br />? 使用SMTP服务器发送邮件<br />? 例子：<br />&lt;mail mailhost="smtp.myisp.com" mailport="1025" subject="Test build"&gt;<br />&lt;from address="me@myisp.com"/&gt;<br />&lt;to address="all@xyz.com"/&gt;<br />&lt;message&gt;The ${buildname} nightly build has completed&lt;/message&gt;<br />&lt;fileset dir="dist"&gt;<br />&lt;includes name="**/*.zip"/&gt;<br />&lt;/fileset&gt;<br />&lt;/mail&gt;<br />? mailhost： SMTP服务器地址<br />? mailport： 服务器端口<br />? subject： 主题<br />? from： 发送人地址<br />? to： 接受人地址<br />? message： 发送的消息<br />? fileset： 设置附件<br /><img src ="http://www.blogjava.net/os586/aggbug/75678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-10-17 16:27 <a href="http://www.blogjava.net/os586/archive/2006/10/17/75678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ant: 入门－配置和使用</title><link>http://www.blogjava.net/os586/archive/2006/10/17/75597.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Tue, 17 Oct 2006 06:02:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/10/17/75597.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/75597.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/10/17/75597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/75597.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/75597.html</trackback:ping><description><![CDATA[
		<table height="130" cellpadding="5" width="130" align="left">
				<tbody>
						<tr>
								<td style="PADDING-BOTTOM: 10px; WIDTH: 130px; HEIGHT: 130px">
										<script type="text/javascript">
												<!--
google_ad_client = "pub-2638910793897145";
google_ad_width = 125;
google_ad_height = 125;
google_ad_format = "125x125_as_rimg";
google_cpa_choice = "CAAQlLeU_AEaCMOz4xdgS_KKKMj19IMB";
//-->
										</script>
										<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
										</script>
								</td>
						</tr>
				</tbody>
		</table>
		<span id="ArticleContent1_ArticleContent1_lblContent">  
<p>首先下载<a href="http://www.javaresource.org/ant/ant-57.html">ant</a>在<a href="http://jakarta.apache.org/builds">http://jakarta.apache.org/builds</a>，然后解压缩到本地，我把它压缩到C:\<a href="http://www.javaresource.org/ant/ant-57.html">ant</a>目录下</p><p><strong>在环境变量修改属性</strong></p><p>在path属性前增加－－－－－－C:\<a href="http://www.javaresource.org/ant/ant-57.html">ant</a>\bin；这样就可以使用<a href="http://www.javaresource.org/ant/ant-57.html">ant</a>了</p><p>build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>文件都包含一个project和至少一个target元素，target元素中包含一个或多个任务元素，任务是一段可执行的代码。</p><p><font color="#000080">根元素是project，三个属性name,default,basedir</font></p><p>name指定工程的名字</p><p>default指定工程默认的target元素</p><p>basedir指定工程的基路径，如果是“.”，表示为build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>所在路径</p><p>&lt;project name="bookstore" default="about" basedir="."&gt;</p><p>&lt;target name="init"&gt;<br />        &lt;tstamp/&gt;</p><p><font color="#008000">&lt;!--初始化各个变量的名字--&gt;</font><br />        &lt;property name="build" value="build" /&gt;<font color="#008000">&lt;!--编译后的目录--&gt;<br /></font>        &lt;property name="src" value="src" /&gt;<font color="#008000">&lt;!--源文件的位置--&gt;<br /></font>       </p><p><font color="#008000">        &lt;!--用到的环境变量的包--&gt;</font></p><p>          &lt;property environment="myenv" /&gt;<br />        &lt;property name="servletpath"  value="${myenv.CATALINA_HOME}/common/lib/servlet-api.jar" /&gt;<br />        &lt;property name="mysqlpath" value="WEB-INF/lib/mysqldriver.jar" /&gt;</p><p> &lt;mkdir dir="${build}" /&gt;<font color="#008000">&lt;!--调用前面的目录参数是${xxx}--&gt;</font><br /> &lt;mkdir dir="${build}\WEB-INF" /&gt;<br /> &lt;mkdir dir="${build}\WEB-INF\classes" /&gt;</p><p>      &lt;copy todir="${build}" &gt;<font color="#008000">&lt;!--拷贝目录文件到新的目录下--&gt;</font><br />        &lt;fileset dir="${basedir}"    &gt;<font color="#008000">&lt;!--原来的目录是basedir参数的路径--&gt;</font><br />           &lt;include name="*.jsp" /&gt;<br />           &lt;include name="*.bmp" /&gt;<br />           &lt;include name="WEB-INF/**" /&gt;<br />           &lt;exclude name="build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>" /&gt;<font color="#008000">&lt;!--不拷贝这个文件--&gt;</font><br />        &lt;/fileset&gt;<br />     &lt;/copy&gt;<br />   &lt;/target&gt;<br />        </p><p>&lt;target name="compile" depends="init"&gt;        <font color="#008000">&lt;!--它依赖init的执行，所以调用它先执行init--&gt;</font></p><p>   &lt;javac srcdir="${src}"<br />             destdir="${build}/WEB-INF/classes"<br />             classpath="${servletpath}:${mysqlpath}"&gt;<br />     &lt;/javac&gt;<br />  &lt;/target&gt;</p><p> </p><p>&lt;target name="bookstorewar" depends="compile"&gt;      <font color="#008000">&lt;!--生成war的任务--&gt;  </font></p><p><font color="#008000">    </font>&lt;war warfile="${build}/bookstore.war" web<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>="${build}/WEB-INF/web.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>"&gt;<br /> &lt;lib dir="${build}/WEB-INF/lib"/&gt;<br /> &lt;classes dir="${build}/WEB-INF/classes"/&gt;<br /> &lt;fileset dir="${build}"/&gt;<br />    &lt;/war&gt; <br /> &lt;/target&gt;</p><p>  &lt;target name="about" &gt;    <font color="#008000">&lt;!--默认的target--&gt;<br />        </font>&lt;echo&gt; <br /> This build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a> file contains targets <br />       for building bookstore web application<br />        &lt;/echo&gt;<br />   &lt;/target&gt;</p><p>&lt;/project&gt;</p><p> </p><p><strong>我们这个build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>在我们的应用的根目录下</strong></p><p><strong>所以运行<a href="http://www.javaresource.org/ant/ant-57.html">ant</a>的方法是:在DOS下</strong></p><p>1.进入C:\myApp，我们的应用目录下 输入: <a href="http://www.javaresource.org/ant/ant-57.html">ant</a>  <font color="#800080">（会搜索当前路径下的build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>文件）</font></p><p>2.直接输入<a href="http://www.javaresource.org/ant/ant-57.html">ant</a> -buildfile c:\myApp\build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a></p><p>3.直接输入<a href="http://www.javaresource.org/ant/ant-57.html">ant</a> -buildfile c:\myApp\build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>  about</p><p>以上三种方式都执行about的target，如果指想编译java文件，我们只要</p><p><font color="#ff0000"><a href="http://www.javaresource.org/ant/ant-57.html">ant</a> -buildfile c:\myApp\build.<a href="http://www.javaresource.org/xml/xml-55.html">xml</a>  compile</font></p></span>
<img src ="http://www.blogjava.net/os586/aggbug/75597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-10-17 14:02 <a href="http://www.blogjava.net/os586/archive/2006/10/17/75597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>