﻿<?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-菠萝三国-文章分类-Ant</title><link>http://www.blogjava.net/boluobn/category/24675.html</link><description>大江东去,浪淘尽...</description><language>zh-cn</language><lastBuildDate>Tue, 14 Aug 2007 13:57:50 GMT</lastBuildDate><pubDate>Tue, 14 Aug 2007 13:57:50 GMT</pubDate><ttl>60</ttl><item><title>结合Axis和Ant开发Web服务</title><link>http://www.blogjava.net/boluobn/articles/136198.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Sun, 12 Aug 2007 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/136198.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/136198.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/136198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/136198.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/136198.html</trackback:ping><description><![CDATA[<p><span>本文结合一个简单示例讲解了怎样把</span><span>Axis</span><span>和</span><span>Ant</span><span>结合起来进行</span><span>Web</span><span>服务的开发。帮助读者从简单的</span><span>java</span><span>源代码或者从一个服务描述文件（</span><span>wsdl</span><span>）开始，用</span><span>Ant</span><span>工具进行构建，设置，并把服务部署到</span><span>Axis</span><span>。</span></p>
<p>&nbsp;</p>
<p><span>首先假定您熟悉</span><span> AXIS </span><span>处理系统和</span><span>Ant</span><span>工具。文中示例所需要的软件如下：</span></p>
<p><span><span><font size=3>l</font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><font size=3>Apache Axis 1.1</font></span></p>
<p><span><span><font size=3>l</font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><font size=3>Apache Ant 1.5.3</font></span></p>
<p><span><span><font size=3>l</font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><font size=3>Jarkat Tomcat 4.1.24</font></span></p>
<p><span>在开始前，假定上述软件已经安装和配置好了。</span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><strong><span>Axis</span></strong><strong><span>和</span></strong><strong><span>Ant</span></strong><strong><span>简介</span></strong><strong></strong></p>
<p><span>Axis </span><span>框架是来自</span><span> Apache Group </span><span>的、基于</span><span> java </span><span>的、最新的</span><span> SOAP </span><span>规范（</span><span>SOAP 1.2</span><span>）和</span><span> SOAP with Attachments </span><span>规范（来自</span><span> Apache Group </span><span>）的开放源代码实现。其本质上是一个</span><span>SOAP</span><span>引擎－－一个构建诸如客户端、服务器、网关等</span><span>SOAP</span><span>处理器的框架。是</span><span>Apache SOAP</span><span>的后继项目。但是，</span><span>Axis</span><span>使用</span><span>SAX</span><span>（基于事件）解析器获得了比</span><span>Apache SOAP</span><span>早期版本</span><span>(</span><span>使用</span><span>DOM</span><span>解析</span><span>)</span><span>非常明显的速度优势。另外，它还具有很强的灵活性和稳定性，支持</span><span>Web</span><span>服务描述语言</span><span>1.1</span><span>版。</span></p>
<p><span>Apache Ant</span><span>是</span><span>Apache</span><span>软件基金会</span><span>jakarta</span><span>项目中的一个子项目，是一个基于</span><span>Java</span><span>的构建工具，类似于</span><span>make</span><span>，但它没有</span><span>make</span><span>那么复杂繁琐。</span><span>Ant</span><span>由一些内置任务（</span><span>task</span><span>）和可选择的任务组成，还可以配置第三方提供的任务。它的构建配置文件基于</span><span>XML</span><span>的，所以容易书写和维护，而且结构清晰。</span><span>Ant</span><span>还可以集成到一些开发环境中（例如</span><span>visual age,jbuilder,Elipse)</span><span>。</span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><strong><span>Axis</span></strong><strong><span>对</span></strong><strong><span>Ant</span></strong><strong><span>的支持</span></strong><strong></strong></p>
<p><span>Axis</span><span>为支持</span><span>Ant</span><span>构建，提供了一个</span><span>axis-ant.jar</span><span>文件。该文件包含三个可选任务</span><span>(task)</span><span>的定义和实现：</span><span>axis-wsdl2java</span><span>，</span><span>axis-java2wsdl</span><span>和</span><span>axis-admin</span><span>。任务</span><span>axis-wsdl2java</span><span>与</span><span>Axis</span><span>提供的工具</span><span>WSDL2Java</span><span>具有同样的功能，根据</span><span>web</span><span>服务描述文件生成对应的</span><span>Java</span><span>源程序，它的属性设置与</span><span>WSDL2Java</span><span>的命令参数设置类似。而任务</span><span>axis-java2wsdl</span><span>则相反，它与</span><span>Java2WSDL</span><span>工具一样，是根据已有的类文件来生成</span><span>Web</span><span>服务描述文件。最后一个任务</span><span>axis-admin</span><span>是用于</span><span>web</span><span>服务的部署和取消部署的，对应于</span><span>Axis</span><span>的</span><span>AminClient</span><span>工具。</span></p>
<p><span>为了使</span><span>Ant</span><span>能够正确使用上述三个任务（</span><span>task</span><span>），还需要做一些配置。注意：</span><span>Apache Ant</span><span>的版本必须是</span><span>1.5.1</span><span>或更高版本。</span></p>
<p><span>1</span><span>．设置系统的环境变量</span><span>CLASSPATH</span><span>包含</span><span>Axis</span><span>提供的</span><span>axis-ant.jar</span><span>文件，或者在</span><span>Ant</span><span>的配置文件（通常是</span><span>build.xml</span><span>）中设置路径包含它。例如，</span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>&lt;path id="axis.classpath"&gt;</font></span></p>
<p><span><font size=3>&nbsp;<span>&nbsp;&nbsp;&nbsp; </span>&lt;fileset dir="${axis.home}/lib"&gt;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>&lt;include name="**/*.jar" /&gt;</font></span></p>
<p><span><font size=3>&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp; </span>&lt;/fileset&gt;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>&lt;/path&gt;</font></span></p>
<p><span><span><font size=3>&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p><span>2</span><span>．然后使用</span><span>&lt;taskdef&gt;</span><span>声明导入</span><span>axis-ant.jar</span><span>文件中的属性文件所定义的任务（</span><span>task</span><span>）列表。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>&lt;taskdef resource="axis-tasks.properties"</span></p>
<p><span>&nbsp;classpathref="axis.classpath" /&gt;</span></p>
<p><span>&nbsp;<span>&nbsp;&nbsp; </span>3</span><span>．设置在构建过程中可能要需要的</span><span>java</span><span>包，例如，</span><span> <span>Axis</span></span><span>所有的</span><span>jar</span><span>包，</span><span>wsdl4j.jar</span><span>，</span><span>junit.jar</span><span>等等。</span></p>
<p><span>&nbsp;</span></p>
<p><strong><span>实例开发</span></strong><strong></strong></p>
<p><span>下面就用一个实例来讲解怎样把</span><span>Ant</span><span>和</span><span>Axis</span><span>结合来开发</span><span>Web</span><span>服务。为了注重本文的目的，我们开发一个比较简单的</span><span>Web</span><span>服务，它接受客户端传入的字符串数组，如果传入的参数为</span><span>null</span><span>，则抛出一个自定义的异常，否则把每个字符串连接起来返回给客户端。</span></p>
<p><span>首先定义一个</span><span>Web</span><span>服务接口</span><span>Hello</span><span>，如下所示：</span></p>
<p><span><span><font size=3>&nbsp; </font></span></span></p>
<p><span><font size=3>&nbsp;package com.bidlink.hello;</font></span></p>
<p><span><font size=3>&nbsp;public interface Hello{</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>public String echo(String[] content ) throws<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>java.rmi.RemoteException,com.bidlink.hello.MyException;</font></span></p>
<p><span><font size=3>&nbsp;}</font></span></p>
<p><span><span><font size=3>&nbsp; </font></span></span></p>
<p><span>&nbsp;</span><span>自定义异常</span><span>MyException</span><span>包含一个时间值，以记录异常出现的时间，如下：</span></p>
<p><span><span><font size=3>&nbsp; </font></span></span></p>
<p><span><font size=3>&nbsp;package com.bidlink.hello;</font></span></p>
<p><span><font size=3>public class MyException extends org.apache.axis.AxisFault implements java.io.Serializable{</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>private java.util.Calendar occurTime;</font></span></p>
<p><span><span><font size=3>&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>public MyException() {</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>}</font></span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>public MyException(</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>java.util.Calendar occurTime) {</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>super();</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.occurTime = occurTime;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>}</font></span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>public java.util.Calendar getOccurTime() {</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return occurTime;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>}</font></span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>public void setOccurTime(java.util.Calendar occurTime) {</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.occurTime = occurTime;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>}<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></p>
<p><span><font size=3>}</font></span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><font size=3><strong><span>1</span></strong><strong><span>．</span><span>axis-java2wsdl</span></strong><strong><span>：从类文件生成服务描述文件</span></strong></font></p>
<p><span>编译上面定义的两个文件</span><span>Hell.java</span><span>和</span><span>MyException.java</span><span>。接着编写</span><span>Ant</span><span>的配置文件</span><span>build.xml</span><span>（文件详细信息请查看示例源代码），使用</span><span>axis-java2wsdl</span><span>任务根据类</span><span>Hello</span><span>来生成</span><span>Web</span><span>服务描述文件</span><span>hello.wsdl</span><span>。任务具体配置如下：</span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>&lt;axis-java2wsdl classname="com.bidlink.hello.Hello"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>location="http://localhost:8080/axis/services/Hello"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>namespace="http://hello.bidlink.com"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>output="hello.wsdl"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>style="RPC"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>extraclasses="com.bidlink.hello.MyException"&gt;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>&lt;classpath&gt;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;pathelement path="${dist}"/&gt;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/classpath&gt;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/axis-java2wsdl&gt;</font></span></p>
<p><span><span><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p><span>其中，</span><span>&lt;pathelement path="${dist}"/&gt;</span><span>指出</span><span>Hello.class</span><span>和</span><span>MyException.class</span><span>文件的位置。</span></p>
<p><span>运行命令</span><span>ant java2wsdl</span><span>，构建出</span><span>Web</span><span>服务描述文件</span><span>hello.wsdl</span><span>。</span></p>
<p><font size=3><strong><span>2</span></strong><strong><span>．</span><span>axis-wsdkl2java</span></strong><strong><span>：从服务描述文件生成服务源程序</span></strong></font></p>
<p><span>下面讲解怎样根据刚刚得到的</span><span>hello.wsdl</span><span>文件生成服务所需要的</span><span>java</span><span>源程序。在这里需要用到任务</span><span>axis-wsdl2java</span><span>。任务属性设置如下：</span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;axis-wsdl2java all="true" </font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp; </span>&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>url="hello.wsdl"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>deployscope="Request"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>output="${gensrc}"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>serverside="true"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>skeletondeploy="false"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>testcase="true"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>noimports="false"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>typemappingversion="1.2"&gt;</font></span></p>
<p><span><span><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/axis-wsdl2java&gt; </font></span></p>
<p><span><font size=3>&nbsp;<span>&nbsp;&nbsp;&nbsp; </span></font></span><span>运行</span><span>ant wsdl2java</span><span>，根据</span><span>axis-wsdl2java</span><span>任务的属性配置生成相应的</span><span>java</span><span>源程序，本例所生成的文件包括：服务端服务接口文件</span><span>Hello.java</span><span>及其实现</span><span>HelloSoapBindingImpl.java</span><span>，以及客户端的</span><span>HelloService.java</span><span>，</span><span>HelloServiceLocator.java</span><span>，</span><span>HelloServiceLocator.java</span><span>和客户端存根文件</span><span>HelloSoapBindingStub.java</span><span>。又因为属性</span><span>testcase="true"</span><span>，所以还生成了测试文件</span><span>HelloServiceTestCase.java</span><span>。当然，自定义异常</span><span>MyException</span><span>也是重新生成的。</span></p>
<p><font size=3><strong><span>3</span></strong><strong><span>．</span><span>axis-admin</span></strong><strong><span>：向</span><span>Axis</span></strong><strong><span>部署</span><span>Hello</span></strong><strong><span>服务</span></strong></font></p>
<p><span>服务源程序生成后，需要根据服务的功能修改</span><span>HelloSoapBindingImpl.java</span><span>文件，以真正实现该</span><span>Web</span><span>服务。修改如下：</span></p>
<p><span><font size=3>&nbsp;/**</font></span></p>
<p><span><font size=3>&nbsp;* HelloSoapBindingImpl.java</font></span></p>
<p><span><font size=3>&nbsp;*</font></span></p>
<p><span><font size=3>&nbsp;* This file was auto-generated from WSDL</font></span></p>
<p><span><font size=3>&nbsp;* by the Apache Axis WSDL2Java emitter.</font></span></p>
<p><span><font size=3>&nbsp;*/</font></span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><span><font size=3>package com.bidlink.hello;</font></span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><span><font size=3>public class HelloSoapBindingImpl implements com.bidlink.hello.Hello{</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>public java.lang.String echo(java.lang.String[] in0) throws java.rmi.RemoteException, com.bidlink.hello.MyException {</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(in0 == null)</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>throw new MyException(java.util.Calendar.getInstance());</font></span></p>
<p><span><span><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p><span><span><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String retStr = "";</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>for(int i=0; i&lt; in0.length; i++)</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>retStr += in0[i];</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return retStr;</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>}</font></span></p>
<p><span><font size=3>&nbsp;</font></span></p>
<p><span><font size=3>}</font></span></p>
<p><span><span><font size=3>&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p><span>编译所有的生成的源程序，最后使用</span><span>axis-admin</span><span>任务向</span><span>Axis</span><span>部署</span><span>Hello Web</span><span>服务。</span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span>&lt;axis-admin</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span>port="${target.port}"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>hostname="${target.server}"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>failonerror="true"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>servletpath="${target.appname}/services/AdminService"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>debug="true"</font></span></p>
<p><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>xmlfile="deploy.wsdd"/&gt;</font></span></p>
<p><span><span><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>运行</span><span>ant deploy</span><span>，部署</span><span>Hello</span><span>服务。</span></p>
<p><font size=3><span><span>&nbsp;&nbsp; </span><strong>&nbsp;</strong></span><strong><span>测试</span></strong></font><strong></strong></p>
<p><span>现在可以测试所部署的</span><span>Web</span><span>服务</span><span>hello</span><span>。可以通过浏览器，也可以利用刚才生成的测试文件</span><span>HelloServiceTestCase.java</span><span>来进行该项工作。如果利用测试文件</span><span>HelloServiceTestCase.java</span><span>，那么还需要对它进行稍作修改。具体来说，就是添加一个</span><span>main</span><span>函数，然后修改所生成的测试方法。</span></p>
<img src ="http://www.blogjava.net/boluobn/aggbug/136198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-12 17:04 <a href="http://www.blogjava.net/boluobn/articles/136198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>axis with ant</title><link>http://www.blogjava.net/boluobn/articles/136197.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Sun, 12 Aug 2007 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/136197.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/136197.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/136197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/136197.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/136197.html</trackback:ping><description><![CDATA[在用eclipes开发web service的时候，经常会用到java2wsdl,wsdl2java等命令，axis在发布的时候提供了相应的ant task，并放到了axis-ant.jar中。<br>&nbsp;&nbsp;按照axis的ant相关文档配置的时候，需要引入相应的ant task，我在做这个配置的时候遇到了些障碍，开始的build.xml如下所示：
<p>&lt;?xml version="1.0"?&gt;<br>&lt;project default="axis" basedir="."&gt;</p>
<p>&lt;property name="axis.home" location="../" /&gt;</p>
<p><em>&lt;path id="axis.classpath"&gt;<br>&nbsp; &lt;fileset dir="${axis.home}/WebRoot/WEB-INF/lib"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;include name="**/*.jar" /&gt;<br>&nbsp; &lt;/fileset&gt;<br>&nbsp; &lt;fileset dir="${axis.home}/WebRoot/WEB-INF/classes"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;include name="**/*.class" /&gt;<br>&nbsp; &lt;/fileset&gt;<br>&lt;/path&gt;</em></p>
<p>&lt;taskdef resource="axis-tasks.properties" classpathref="/axis.classpath" /&gt;</p>
<p>&lt;target name="init" /&gt;</p>
<p>&lt;target name="axis"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;axis-java2wsdl <br>&nbsp;&nbsp;classname="axis.service.SimpleObjectCreator"&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;location="<a href="http://localhost:8080/axis/services/SimpleObjectCreator"><strong><font color=#006f93>http://localhost:8080/axis/services/SimpleObjectCreator</font></strong></a>" <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;namespace="service.axis"<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;output="simpleObject.wsdl"<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;style="RPC"<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;extraclasses="axis.bean.SimpleObject"<br>&nbsp;&nbsp;&nbsp; &gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;classpath refid="axis.classpath"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/axis-java2wsdl&gt;<br>&nbsp;&nbsp;&nbsp; &lt;axis-wsdl2java all="true" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url="simpleObject.wsdl"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deployscope="Request"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output="${axis.home}/src"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serverside="true"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skeletondeploy="false"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; testcase="true"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; noimports="false"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typemappingversion="1.2"<br>&nbsp;&nbsp;&nbsp; /&gt;<br>&lt;/target&gt;</p>
<p>&lt;target name="deploy"&gt;<br>&nbsp;&lt;axis-admin<br>&nbsp;&nbsp;port="8080"<br>&nbsp;&nbsp;hostname="localhost"<br>&nbsp;&nbsp;failonerror="true"<br>&nbsp;&nbsp;servletpath="axis/services/AdminService"<br>&nbsp;&nbsp;debug="true"<br>&nbsp;&nbsp;xmlfile="${axis.home}\src\axis\service\deploy.wsdd"<br>&nbsp;/&gt;<br>&lt;/target&gt;<br>&nbsp;&nbsp;&nbsp; <br>&lt;/project&gt;</p>
<p>&nbsp; 在执行ant的时候，总是报<br>&nbsp;&nbsp;&nbsp; java.util.zip.ZipException: error in opening zip file<br>的错误，百思不得其解，后来找到了错误的原因，原来出在<br>&nbsp;&nbsp;&nbsp; &lt;path id="axis.classpath"&gt;...&lt;/path&gt;<br>的定义上，因为这里包含<br>&nbsp; &lt;fileset dir="${axis.home}/WebRoot/WEB-INF/classes"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;include name="**/*.class" /&gt;<br>&nbsp; &lt;/fileset&gt;<br>部分，&lt;taskdef&gt;解析时会把我指定的class文件当作一个压缩文件进行解压，产生异常，改成如下定义即可：<br>&lt;path id="axis.classpath"&gt;<br>&nbsp; &lt;fileset dir="${axis.home}/WebRoot/WEB-INF/lib"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;include name="**/*.jar" /&gt;<br>&nbsp; &lt;/fileset&gt;<br>&nbsp; &lt;pathelement location="${axis.home}/WebRoot/WEB-INF/classes"/&gt;<br>&lt;/path&gt;<br>第二个fileset改成pathelement，当&lt;taskdef&gt;解析时会把指定的location当作一个路径，不会报错。<br>&nbsp; 对于开源的ant真是又爱又恨啊，可恨的是文档太少了，如&lt;path&gt;,&lt;taskdef&gt;的说明等，惜墨如金啊。</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/136197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-12 17:03 <a href="http://www.blogjava.net/boluobn/articles/136197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Axis开发之工业化－ant使用</title><link>http://www.blogjava.net/boluobn/articles/136183.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Sun, 12 Aug 2007 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/136183.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/136183.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/136183.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/136183.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/136183.html</trackback:ping><description><![CDATA[<p><span>Axis</span><span>为支持</span><span>Ant</span><span>构建，提供了一个</span><span>axis-ant.jar</span><span>文件。该文件包含三个可选任务</span><span>(task)</span><span>的定义和实现：</span><strong><span>axis-wsdl2java</span></strong><strong><span>，</span></strong><strong><span>axis-java2wsdl</span></strong><strong><span>和</span></strong><strong><span>axis-admin</span></strong><span>。</span><span> </span>
<p><span><span>1）<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>任务</span></span><span>axis-wsdl2java</span><span>与</span><span>Axis</span><span>提供的工具</span><span>WSDL2Java</span><span>具有同样的功能，根据</span><span>web</span><span>服务描述文件生成对应的</span><span>Java</span><span>源程序，它的属性设置与</span><span>WSDL2Java</span><span>的命令参数设置类似。</span><span> </span>
<p><span><span>2）<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>任务</span></span><span>axis-java2wsdl</span><span>则相反，它与</span><span>Java2WSDL</span><span>工具一样，是根据已有的类文件来生成</span><span>Web</span><span>服务描述文件。</span><span> </span>
<p><span><span>3）<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>axis-admin</span></span><span>是用于</span><span>web</span><span>服务的部署和取消部署的，对应于</span><span>Axis</span><span>的</span><span>AminClient</span><span>工具。</span><span> </span>
<p><span>为了使用</span><span>ant</span><span>来建构，首先需要将</span><span>axis-ant.jar</span><span>包拷贝到</span><span>ant</span><span>的</span><span>lib</span><span>目录下。</span><span> </span>
<p><span>一、下面是详细的步骤，列了一个</span><span>1</span><span>，</span><span>2</span><span>，</span><span>3</span><span>，</span><span>4</span><span>，</span><span>5</span><span>，看起来清楚一些</span><span> </span>
<p><span><span>1．<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>用</span></span><span>&lt;taskdef&gt;</span><span>声明导入</span><span>axis-ant.jar</span><span>文件中的属性文件所定义的任务（</span><span>task</span><span>）列表。</span><span> </span>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=549>
            <p><span>&lt;taskdef resource="axis-tasks.properties"&nbsp;classpathref="axis.classpath"/&gt; </span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span><span>2．<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>把</span></span><span>axis</span><span>的包都导进来</span><span> </span>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=549>
            <p><span>&lt;property name="axis.home" value="G:/package/axis-1_3"/&gt; </span>
            <p><span>&lt;!--</span><span>定义</span><span>classpath--&gt; </span>
            <p><span>&lt;path id="axis.classpath"&gt; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!—-</span><span>这里导入的是</span><span>axis</span><span>的所有包</span><span>--&gt; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;fileset dir="${axis.home}/lib"&gt; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;include name="**/*.jar" /&gt; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>&lt;/fileset&gt; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;!—- </span>
            <p><span>这里导入的是</span><span>javamail</span><span>的包，如果</span><span>web</span><span>服务有附件的时候要用到，如果没有包含进来会有一个警告</span><span> </span>
            <p><span>--&gt; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;fileset dir="G:/workpackage/j2ee"&gt; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;include name="**/*.jar" /&gt; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>&lt;/fileset&gt; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!—-</span><span>其他的包</span><span>--&gt; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>&lt;fileset dir="${basedir}"&gt; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;include name="other.jar" /&gt; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>&lt;/fileset&gt; </span>
            <p><span>&lt;/path&gt;</span><span> </span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span><span>3．<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>生成</span></span><span>web</span><span>描述文件和根据描述文件生成</span><span>java</span><span>源程序</span><span> </span>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=24>
            <p><span>1 </span>
            <p><span>2 </span>
            <p><span>3 </span>
            <p><span>4 </span>
            <p><span>5 </span>
            <p><span>6 </span>
            <p><span>7 </span>
            <p><span>8 </span>
            <p><span>9 </span>
            <p><span>10 </span>
            <p><span>11 </span>
            <p><span>12 </span>
            <p><span>13 </span>
            <p><span>14 </span>
            <p><span>15 </span>
            <p><span>16 </span>
            <p><span>17 </span>
            <p><span>18 </span>
            <p><span>19 </span></p>
            </td>
            <td vAlign=top width=525>
            <p><span>&lt;target name="axis" depends="init"&gt; </span>
            <p><span>&lt;axis-java2wsdl </span>
            <p><span>classname="net.wide.axis.service.SimpleObjectCreator" <span>&nbsp;&nbsp;&nbsp; </span>location="http://localhost:8080/axis/services/SimpleObjectCreator" </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>namespace="service.axis.wide.net" </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>output="simpleObject.wsdl" </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>style="RPC" </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>extraclasses="net.wide.axis.bean.SimpleObject" </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>/&gt;</span><span> </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;axis-wsdl2java all="true" </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>url="simpleObject.wsdl" </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>deployscope="Request" </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>output="${basedir}/src" </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>serverside="true" </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>skeletondeploy="false" </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>testcase="true" </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>noimports="false" </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>typemappingversion="1.2"/&gt;</span><span> </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>&lt;/target&gt;</span><span> </span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>3</span><span>行：我们要发布的</span><span>web</span><span>服务接口，需要先定义这个接口，如果是一个具体的类，下面用</span><span>axis-wsdl2java</span><span>来生成</span><span>java</span><span>文件的时候，会生成该接口和他的实现文件。</span><span> </span>
<p><span>4</span><span>行：</span><span>web</span><span>服务发布的位置</span><span> </span>
<p><span>5</span><span>行：</span><span>namespace</span><span>，这一行用红字标出来，是要注意的，&#8220;</span><span>service.axis.wide.net</span><span>&#8221;</span><span>，跟我的包结构刚好倒过来，当用</span><span>axis-wsdl2java</span><span>来生成</span><span>java</span><span>文件的时候，包结构就是&#8220;</span><span>net.wide.axis.service</span><span>&#8221;。</span><span> </span>
<p><span>6</span><span>行：生成的</span><span>webservice</span><span>描述文件，</span><span>axis-wsdl2java</span><span>正是用他来生成</span><span>java</span><span>文件的</span><span> </span>
<p><span><span>4．<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>将生成的</span></span><span>java</span><span>文件编译，解下就是部署</span><span> </span>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=24>
            <p><span>1 </span>
            <p><span>2 </span>
            <p><span>3 </span>
            <p><span>4 </span>
            <p><span>5 </span>
            <p><span>6 </span>
            <p><span>7 </span>
            <p><span>8 </span>
            <p><span>9 </span></p>
            </td>
            <td vAlign=top width=525>
            <p><span>&lt;target name="deploy" depends="init"&gt; </span>
            <p><span>&lt;axis-admin </span>
            <p><span>port="8080" </span>
            <p><span>hostname="localhost" </span>
            <p><span>failonerror="true" </span>
            <p><span>servletpath="axis/services/AdminService" </span>
            <p><span>debug="true" </span>
            <p><span>xmlfile="${basedir}\src\net\wide\axis\service\deploy.wsdd"/&gt; </span>
            <p><span>&lt;/target&gt;</span><span> </span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>6</span><span>行：</span><span>servletpath</span><span>要跟</span><span>web.xml</span><span>中的保持一致</span><span> </span>
<p><span>8</span><span>行：上一步生成的部署文件</span><span> </span>
<p><span><span>5．<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>测试</span></span><span> </span>
<p><span>二、实例，通过一个实例来看看使用</span><span>ant</span><span>的开发步骤。包括下面的内容：</span><span> </span>
<p><span><span>1）<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>服务端创建一个</span></span><span>JavaBean</span><span>，并且返回给客户端</span><span> </span>
<p><span><span>2）<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>客户端将一个</span></span><span>JavaBean</span><span>做为参数传递给服务器端</span><span> </span>
<p><span><span>3）<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>服务器端返回一个</span></span><span>JavaBean</span><span>数组</span><span> </span>
<p><span><span>1．<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>定义</span></span><span>JavaBean </span>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=537>
            <p><span>package net.wide.axis.bean; </span>
            <p><span>public class SimpleObject&nbsp;implements Serializable { </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>private String name; </span>
            <p><span><span>&nbsp;&nbsp; </span>&nbsp;public getName() { </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return name; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>} </span>
            <p><span>public void setName(String name) { </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.name = name; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>} </span>
            <p><span>} </span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>注意</span><span>JavaBean</span><span>需要实现</span><span>Serializable</span><span>接口</span><span> </span>
<p><span><span>2．<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>定义</span></span><span>web</span><span>服务接口</span><span> </span>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=537>
            <p><span>package net.wide.axis.service; </span>
            <p><span>import net.wide.axis.bean.SimpleObject; </span>
            <p><span>public interface SimpleObjectCreator{ </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>public SimpleObject createSimpleObject(String name); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>public void storeSimpleObject(SimpleObject simpleObject); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>public SimpleObject[] createSimpleObjects(); </span>
            <p><span>} </span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span><span>3．<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>运行</span></span><span>Ant axis</span><span>，生成了下面的文件</span></p>
<p><img height=206 alt="" src="http://blog.csdn.net/images/blog_csdn_net/UPCCPU/a.jpg" width=340></p>
<p><span><shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"></shapetype><stroke joinstyle="miter"></stroke>
<formulas>
</formulas>
<f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f>
<path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path>
<lock aspectratio="t" v:ext="edit"></lock><shape id=_x0000_i1025 type="#_x0000_t75"></shape><imagedata o:title="" src="file:///C:\DOCUME~1\zcy\LOCALS~1\Temp\msohtml1\01\clip_image001.png"></imagedata></span>
<p><span><span>4．<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>实现</span></span><span>SimpleObjectCreatorSoapBindingImpl.java</span><span>，这个</span><span>java</span><span>文件就是</span><span>SimpleObjectCreator</span><span>的实现文件，简单实现如下：</span><span> </span>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=537>
            <p><span>public class SimpleObjectCreatorSoapBindingImpl </span>
            <p><span>implements net.wide.axis.service.SimpleObjectCreator{ </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>public&nbsp;SimpleObject createSimpleObject(java.lang.String name) </span>
            <p><span>throws java.rmi.RemoteException { </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>System.out.println("</span><span>创建</span><span>SimpleObject..."); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SimpleObject simpleObject = new SimpleObject(); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>simpleObject.setName(name); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return simpleObject; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>} </span>
            <p>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>public void storeSimpleObject(SimpleObject simpleObject) </span>
            <p><span>throws java.rmi.RemoteException { </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span><span>&nbsp;&nbsp; </span>System.out.println("Store"); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println(simpleObject.getName()); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>} </span>
            <p>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>public SimpleObject[] createSimpleObjects() </span>
            <p><span>throws java.rmi.RemoteException { </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>SimpleObject[] simpleObjects = new SimpleObject[2]; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>simpleObjects[0] = new SimpleObject(); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>simpleObjects[1] = new SimpleObject(); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>simpleObjects[0].setName("First Object"); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>simpleObjects[1].setName("Second Object"); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return simpleObjects; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>} </span>
            <p><span>} </span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>
<p><span><span>5．<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>部署</span></span><span>ant deploy </span>
<p><span><span>6．<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>测试</span></span><span> </span>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=513>
            <p><span>public static void main(String[] args) </span>
            <p><span>throws ServiceException, RemoteException { </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span><span>String endPoint = </span></span>
            <p><span>&nbsp;"http://localhost:8080/axis/services/SimpleObjectCreator?wsdl"; </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Service service = new Service(); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Call call = (Call) service.createCall(); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>call.setTargetEndpointAddress(endPoint); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>QName qname = </span></span>
            <p><span>new QName("http://bean.axis.wide.net","SimpleObject"); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>//</span></span><span>测试</span><span>createSimpleObject</span><span>方法，它创建一个</span><span>SimpleObject</span><span>并且返回该对象</span><span> </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>call.registerTypeMapping(SimpleObject.class, </span></span>
            <p><span>qname, </span>
            <p><span>new BeanSerializerFactory(SimpleObject.class, qname), </span>
            <p><span>new BeanDeserializerFactory(SimpleObject.class, qname)); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>call.setOperationName("createSimpleObject"); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SimpleObject simpleObject = </span>
            <p><span>(SimpleObject) call.invoke(new Object[]{"Hello"}); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println(simpleObject.getName()); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>//</span></span><span>测试</span><span>storeSimpleObject</span><span>，客户端传递一个</span><span>SimpleObject </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>call.setOperationName("storeSimpleObject"); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>call.invoke(new Object[]{simpleObject});<span>&nbsp;&nbsp;&nbsp; </span></span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>//</span></span><span>测试服务端返回一个</span><span>SimpleObject</span><span>数组，打印出数组的长度</span><span> </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>qname = </span>
            <p><span>new QName("service.axis.wide.net","ArrayOf_tns1_SimpleObject"); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>call.registerTypeMapping(SimpleObject.class, </span>
            <p><span>qname, </span>
            <p><span>new BeanSerializerFactory(SimpleObject.class, qname), </span>
            <p><span>new BeanDeserializerFactory(SimpleObject.class, qname)); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>call.setOperationName("createSimpleObjects"); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SimpleObject[] simpleObjects = </span>
            <p><span>(SimpleObject[]) call.invoke(new Object[]{}); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println(simpleObjects.length); </span>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>} </span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span><span>7．<span>&nbsp;&nbsp; </span></span></span><span dir=ltr><span>结合</span></span><span>/WEB-INF/server-config.wsdd</span><span>来分析，部署的时候会生成这个部署描述文件</span><span> </span>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=568>
            <p align=left><span>&lt;</span><span>service </span><span>name</span><span>=</span><span>"SimpleObjectCreator" </span><span>provider</span><span>=</span><span>"java:RPC"</span><span>&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>operation </span><span>name</span><span>=</span><span>"createSimpleObject" </span>
            <p align=left><span>qname</span><span>=</span><span>"ns2:createSimpleObject"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;</span><span>returnQName</span><span>=</span><span>"createSimpleObjectReturn" </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>soapAction</span><span>=</span><span>"" </span>
            <p align=left><span>xmlns:ns1</span><span>=</span><span><a href="http://bean.axis.wide.net/">http://bean.axis.wide.net/</a></span><span> </span>
            <p align=left><span>returnType</span><span>=</span><span>"ns1:SimpleObject"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>xmlns:ns2</span><span>=</span><span>"service.axis.wide.net"</span><span>&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>parameter </span>
            <p align=left><span>name</span><span>=</span><span>"in0" </span>
            <p align=left><span>type</span><span>=</span><span>"xsd:string"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>xmlns:xsd</span><span>=</span><span>"http://www.w3.org/2001/XMLSchema" </span><span>/&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;/</span><span>operation</span><span>&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>operation </span><span>name</span><span>=</span><span>"storeSimpleObject" </span>
            <p align=left><span>qname</span><span>=</span><span>"ns3:storeSimpleObject"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>soapAction</span><span>=</span><span>"" </span>
            <p align=left><span>xmlns:ns3</span><span>=</span><span>"service.axis.wide.net"</span><span>&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>parameter </span><span>name</span><span>=</span><span>"in0" </span><span>type</span><span>=</span><span>"ns4:SimpleObject"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>xmlns:ns4</span><span>=</span><span>"http://bean.axis.wide.net" </span><span>/&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;/</span><span>operation</span><span>&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>operation </span><span>name</span><span>=</span><span>"createSimpleObjects"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>qname</span><span>=</span><span>"ns5:createSimpleObjects"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>returnQName</span><span>=</span><span>"createSimpleObjectsReturn"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>returnType</span><span>=</span><span>"ns5:ArrayOf_tns1_SimpleObject" </span>
            <p align=left><span>soapAction</span><span>=</span><span>""</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>xmlns:ns5</span><span>=</span><span>"service.axis.wide.net" </span><span>/&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>parameter </span><span>name</span><span>=</span><span>"wsdlServicePort" </span><span>value</span><span>=</span><span>"SimpleObjectCreator" </span><span>/&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>parameter </span><span>name</span><span>=</span><span>"className"<span> </span><span>&nbsp;&nbsp;&nbsp; </span></span><span>value</span><span>=</span><span>"net.wide.axis.service.SimpleObjectCreatorSoapBindingImpl" </span><span>/&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>parameter </span><span>name</span><span>=</span><span>"typeMappingVersion" </span><span>value</span><span>=</span><span>"1.2" </span><span>/&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>parameter </span><span>name</span><span>=</span><span>"allowedMethods"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>value</span><span>=</span><span>"storeSimpleObject createSimpleObject createSimpleObjects" </span><span>/&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>parameter </span><span>name</span><span>=</span><span>"wsdlServiceElement"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>value</span><span>=</span><span>"SimpleObjectCreatorService" </span><span>/&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>parameter </span><span>name</span><span>=</span><span>"wsdlTargetNamespace" </span>
            <p align=left><span>value</span><span>=</span><span>"service.axis.wide.net" </span><span>/&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>parameter </span><span>name</span><span>=</span><span>"wsdlPortType" </span><span>value</span><span>=</span><span>"SimpleObjectCreator" </span><span>/&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>parameter </span><span>name</span><span>=</span><span>"scope" </span><span>value</span><span>=</span><span>"Request" </span><span>/&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>parameter </span><span>name</span><span>=</span><span>"schemaUnqualified"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>value</span><span>=</span><span>"service.axis.wide.net,http://bean.axis.wide.net" </span><span>/&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>typeMapping</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span></span><span>deserializer</span><span>=</span><span>"org.apache.axis.encoding.ser.BeanDeserializerFactory"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>encodingStyle</span><span>=</span><span>"http://schemas.xmlsoap.org/soap/encoding/"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>qname</span><span>=</span><span>"ns6:SimpleObject"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>serializer</span><span>=</span><span>"org.apache.axis.encoding.ser.BeanSerializerFactory"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>type</span><span>=</span><span>"java:net.wide.axis.bean.SimpleObject"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>xmlns:ns6</span><span>=</span><span>"http://bean.axis.wide.net" </span><span>/&gt;</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>arrayMapping </span><span>innerType</span><span>=</span><span>"ns8:SimpleObject"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>languageSpecificType</span><span>=</span><span>"java:net.wide.axis.bean.SimpleObject[]"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>qname</span><span>=</span><span>"ns7:ArrayOf_tns1_SimpleObject"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>xmlns:ns7</span><span>=</span><span>"service.axis.wide.net"</span><span> </span>
            <p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>xmlns:ns8</span><span>=</span><span>"http://bean.axis.wide.net" </span><span>/&gt;</span><span> </span>
            <p><span>&lt;/</span><span>service</span><span>&gt;</span><span> </span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>这一段是</span><span>SimpleObjectCreator</span><span>的描述。结合</span><span>createSimpleObject</span><span>方法的描述与测试代码中的：</span><span> </span>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>QName qname = new QName("http://bean.axis.wide.net","SimpleObject");</span><span> </span>
<p align=left><span>在</span><span>createSimpleObject</span><span>方法的描述中有下面的一段</span><span> </span>
<p align=left><span>xmlns:ns1</span><span>=</span><span><a href="http://bean.axis.wide.net/">http://bean.axis.wide.net/</a></span><span> </span>
<p><span>returnType</span><span>=</span><span>"ns1:SimpleObject"</span><span> </span>
<p><span>对比就知道了，我们使用的命名空间是<span>：</span></span><span><a href="http://bean.axis.wide.net/">http://bean.axis.wide.net/</a></span><span> </span>
<p><span>其他几个也是这样。</span><span> </span></p>
<img src ="http://www.blogjava.net/boluobn/aggbug/136183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-12 16:24 <a href="http://www.blogjava.net/boluobn/articles/136183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ant简介</title><link>http://www.blogjava.net/boluobn/articles/136156.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Sun, 12 Aug 2007 04:43:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/136156.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/136156.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/136156.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/136156.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/136156.html</trackback:ping><description><![CDATA[<strong>&nbsp;</strong>Ant的概念 <br>可能有些读者并不连接什么是Ant以及入可使用它，但只要使用通过Linux系统得读者，应该知道make这个命令。当编译Linux内核及一些软件的源程序时，经常要用这个命令。Make命令其实就是一个项目管理工具，而Ant所实现功能与此类似。像make，gnumake和nmake这些编译工具都有一定的缺陷，但是Ant却克服了这些工具的缺陷。最初Ant开发者在开发跨平台的应用时，用样也是基于这些缺陷对Ant做了更好的设计。
<p>Ant 与 makefile <br>Makefile有一些不足之处，比如很多人都会碰到的烦人的Tab问题。最初的Ant开发者多次强调&#8221;只是我在Tab前面加了一个空格，所以我的命令就不能执行&#8221;。有一些工具在一定程度上解决了这个问题，但还是有很多其他的问题。Ant则与一般基于命令的工具有所不同，它是Java类的扩展。Ant运行需要的XML格式的文件不是Shell命令文件。它是由一个Project组成的，而一个Project又可分成可多target，target再细分又分成很多task，每一个task都是通过一个实现特定接口的java类来完成的。</p>
<p>Ant的优点</p>
<p>Ant是Apache软件基金会JAKARTA目录中的一个子项目，它有以下的优点。 <br>跨平台性。Ant是存Java语言编写的，所示具有很好的跨平台性。 <br>操作简单。Ant是由一个内置任务和可选任务组成的。Ant运行时需要一个XML文件(构建文件)。Ant通过调用target树，就可以执行各种task。每个task实现了特定接口对象。由于Ant构建文件时XML格式的文件，所以和容易维护和书写，而且结构很清晰。 <br>Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点，它很容易集成到一些开发环境中去。</p>
<p>Ant 开发</p>
<p>Ant的构建文件 <br>当开始一个新的项目时，首先应该编写Ant构建文件。构建文件定义了构建过程，并被团队开发中每个人使用。Ant构建文件默认命名为build.xml，也可以取其他的名字。只不过在运行的时候把这个命名当作参数传给Ant。构建文件可以放在任何的位置。一般做法是放在项目顶层目录中，这样可以保持项目的简洁和清晰。下面是一个典型的项目层次结构。 <br>(1) src存放文件。 <br>(2) class存放编译后的文件。 <br>(3) lib存放第三方JAR包。 <br>(4) dist存放打包，发布以后的代码。 <br>Ant构建文件是XML文件。每个构建文件定义一个唯一的项目(Project元素)。每个项目下可以定义很多目标(target元素)，这些目标之间可以有依赖关系。当执行这类目标时，需要执行他们所依赖的目标。 每个目标中可以定义多个任务，目标中还定义了所要执行的任务序列。Ant在构建目标时必须调用所定义的任务。任务定义了Ant实际执行的命令。Ant中的任务可以为3类。 <br>（1） 核心任务。核心任务是Ant自带的任务。 <br>（2） 可选任务。可选任务实来自第三方的任务，因此需要一个附加的JAR文件。 <br>（3） 用户自定义的任务。用户自定义的任务实用户自己开发的任务。 <br>1.&lt;project&gt;标签 <br>每个构建文件对应一个项目。&lt;project&gt;标签时构建文件的根标签。它可以有多个内在属性，</p>
<p>就如代码中所示，其各个属性的含义分别如下。 <br>(1) default表示默认的运行目标，这个属性是必须的。 <br>(2) basedir表示项目的基准目录。 <br>(3) name表示项目名。 <br>(4) description表示项目的描述。 <br>每个构建文件都对应于一个项目，但是大型项目经常包含大量的子项目，每一个子项目都可以有自己的构建文件。</p>
<p>2.&lt;target&gt;标签 <br>一个项目标签下可以有一个或多个target标签。一个target标签可以依赖其他的target标签。例如，有一个target用于编译程序，另一个target用于声称可执行文件。在生成可执行文件之前必须先编译该文件，因策可执行文件的target依赖于编译程序的target。Target的所有属性如下。 <br>(1).name表示标明，这个属性是必须的。 <br>(2).depends表示依赖的目标。 <br>(3)if表示仅当属性设置时才执行。 <br>(4)unless表示当属性没有设置时才执行。 <br>(5)description表示项目的描述。 <br>Ant的depends属性指定了target的执行顺序。Ant会依照depends属性中target出现顺序依次执行每个target。在执行之前，首先需要执行它所依赖的target。程序中的名为run的target的</p>
<p>depends属性compile，而名为compile的target的depends属性是prepare，所以这几个target执</p>
<p>行的顺序是prepare-&gt;compile-&gt;run。 <br>一个target只能被执行一次，即使有多个target依赖于它。如果没有if或unless属性，target总</p>
<p>会被执行。</p>
<p>3.&lt;mkdir&gt;标签 <br>该标签用于创建一个目录，它有一个属性dir用来指定所创建的目录名，其代码如下： <br>&lt;mkdir dir=&#8221;${class.root}&#8221;/&gt; <br>通过以上代码就创建了一个目录，这个目录已经被前面的property标签所指定。</p>
<p>4&lt;jar&gt;标签 <br>该标签用来生成一个JAR文件，其属性如下。 <br>(1) destfile表示JAR文件名。 <br>(2) basedir表示被归档的文件名。 <br>(3) includes表示别归档的文件模式。 <br>(4) exchudes表示被排除的文件模式。</p>
<p>5．&lt;javac标签&gt; <br>该标签用于编译一个或一组java文件，其属性如下。 <br>(1).srcdir表示源程序的目录。 <br>(2).destdir表示class文件的输出目录。 <br>(3).include表示被编译的文件的模式。 <br>(4).excludes表示被排除的文件的模式。 <br>(5).classpath表示所使用的类路径。 <br>(6).debug表示包含的调试信息。 <br>(7).optimize表示是否使用优化。 <br>(8).verbose 表示提供详细的输出信息。 <br>(9).fileonerror表示当碰到错误就自动停止。</p>
<p>6．&lt;java&gt;标签 <br>该标签用来执行编译生成的.class文件，其属性如下。 <br>(1).classname 表示将执行的类名。 <br>(2).jar表示包含该类的JAR文件名。 <br>(3).classpath所表示用到的类路径。 <br>(4).fork表示在一个新的虚拟机中运行该类。 <br>(5).failonerror表示当出现错误时自动停止。 <br>(6).output 表示输出文件。 <br>(7).append表示追加或者覆盖默认文件。</p>
<p>7.&lt;delete&gt;标签 <br>该标签用于删除一个文件或一组文件，去属性如下。 <br>(1)/file表示要删除的文件。 <br>(2).dir表示要删除的目录。 <br>(3).includeEmptyDirs 表示指定是否要删除空目录，默认值是删除。 <br>(4).failonerror 表示指定当碰到错误是否停止，默认值是自动停止。 <br>(5).verbose表示指定是否列出所删除的文件，默认值为不列出。</p>
<p>8.&lt;copy&gt;标签 <br>该标签用于文件或文件集的拷贝，其属性如下。 <br>(1).file 表示源文件。 <br>(2).tofile 表示目标文件。 <br>(3).todir 表示目标目录。 <br>(4).overwrite 表示指定是否覆盖目标文件，默认值是不覆盖。 <br>(5).includeEmptyDirs 表示制定是否拷贝空目录，默认值为拷贝。 <br>(6).failonerror 表示指定如目标没有发现是否自动停止，默认值是停止。 <br>(7).verbose 表示制定是否显示详细信息，默认值不显示。</p>
<p>Ant的数据类型 <br>在构建文件中为了标识文件或文件组，经常需要使用数据类型。数据类型包含在</p>
<p>org.apache.tool.ant.types包中。下面镜简单介绍构建文件中一些常用的数据类型。</p>
<p>1. argument 类型 <br>由Ant构建文件调用的程序，可以通过&lt;arg&gt;元素向其传递命令行参数，如apply,exec和java任务均可接受嵌套&lt;arg&gt;元素，可以为各自的过程调用指定参数。以下是&lt;arg&gt;的所有属性。 <br>(1).values 是一个命令参数。如果参数种有空格，但又想将它作为单独一个值，则使用此属性。 <br>(2).file表示一个参数的文件名。在构建文件中，此文件名相对于当前的工作目录。 <br>(3).line表示用空格分隔的多个参数列表。 <br>(4).path表示路径。</p>
<p>2.ervironment 类型 <br>由Ant构建文件调用的外部命令或程序，&lt;env&gt;元素制定了哪些环境变量要传递给正在执行的系统命令，&lt;env&gt;元素可以接受以下属性。 <br>(1).file表示环境变量值得文件名。此文件名要被转换位一个绝对路径。 <br>(2).path表示环境变量的路径。Ant会将它转换为一个本地约定。 <br>(3).value 表示环境变量的一个直接变量。 <br>(4).key 表示环境变量名。 <br>注意 file path 或 value只能取一个。</p>
<p>3.filelist类型 <br>Filelist 是一个支持命名的文件列表的数据类型，包含在一个filelist类型中的文件不一定是</p>
<p>存在的文件。以下是其所有的属性。 <br>(1).dir是用于计算绝对文件名的目录。 <br>(2).files 是用逗号分隔的文件名列表。 <br>(3).refid 是对某处定义的一个&lt;filelist&gt;的引用。 <br>注意 dir 和 files 都是必要的，除非指定了refid(这种情况下，dir和files都不允许使用)。</p>
<p>4.fileset类型 <br>Fileset 数据类型定义了一组文件，并通常表示为&lt;fileset&gt;元素。不过，许多ant任务构建成了隐式的fileset,这说明他们支持所有的fileset属性和嵌套元素。以下为fileset 的属性列表。 (1).dir表示fileset 的基目录。 <br>(2).casesensitive的值如果为false，那么匹配文件名时，fileset不是区分大小写的，其默认</p>
<p>值为true. <br>(3).defaultexcludes 用来确定是否使用默认的排除模式，默认为true。 <br>(4).excludes 是用逗号分隔的需要派出的文件模式列表。 <br>(5).excludesfile 表示每行包含一个排除模式的文件的文件名。 <br>(6).includes 是用逗号分隔的，需要包含的文件模式列表。 <br>(7).includesfile 表示每行包括一个包含模式的文件名。</p>
<p>5.patternset 类型 <br>Fileset 是对文件的分组，而patternset是对模式的分组，他们是紧密相关的概念。&lt;patternset&gt;支持4个属性：includes excludex includexfile 和 excludesfile,与fileset相同。Patternset 还允许以下嵌套元素：include,exclude,includefile 和 excludesfile.</p>
<p>6.filterset 类型 <br>Filterset定义了一组过滤器，这些过滤器将在文件移动或复制时完成文件的文本替换。 <br>主要属性如下： <br>(1).begintoken 表示嵌套过滤器所搜索的记号，这是标识其开始的字符串。 <br>(2).endtoken表示嵌套过滤器所搜索的记号这是标识其结束的字符串。 <br>(3).id是过滤器的唯一标志符。 <br>(4).refid是对构建文件中某处定义一个过滤器的引用。</p>
<p>7.Path类型 <br>Path元素用来表示一个类路径，不过它还可以用于表示其他的路径。在用作揖个属性时，路经中的各项用分号或冒号隔开。在构建的时候，此分隔符将代替当前平台中所有的路径分隔符，其拥有的属性如下。 <br>(1).location 表示一个文件或目录。Ant在内部将此扩展为一个绝对路径。 <br>(2).refid 是对当前构建文件中某处定义的一个path的引用。 <br>(3).path表示一个文件或路径名列表。</p>
<p>8.mapper类型 <br>Mapper类型定义了一组输入文件和一组输出文件间的关系，其属性如下。 <br>(1).classname 表示实现mapper类的类名。当内置mapper不满足要求时，用于创建定制mapper. <br>(2).classpath表示查找一个定制mapper时所用的类型路径。 <br>(3).classpathref是对某处定义的一个类路径的引用。 <br>(4).from属性的含义取决于所用的mapper. <br>(5).to属性的含义取决于所用的mapper. <br>(6).type属性的取值为identity，flatten glob merge regexp 其中之一，它定义了要是用的内置mapper的类型。</p>
<p>Ant 的运行 <br>安装好Ant并且配置好路径之后，在命令行中切换到构建文件的目录，输入Ant命令就可以运行Ant.若没有指定任何参数，Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为构建文件。如果使用了 &#8211;find 选项，Ant 就会在上级目录中找构建文件，直至到达文件系统得跟目录。如果构建文件的名字不是build.xml ，则Ant运行的时候就可以使用 &#8211;buildfile file ,这里file 指定了要使用的构建文件的名称，示例如下： <br>Ant <br>如下说明了表示当前目录的构建文件为build.xml 运行 ant 执行默认的目标。</p>
<p>Ant &#8211;buildfile test.xml <br>使用当前目录下的test.xml 文件运行Ant ,执行默认的目标。</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/136156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-12 12:43 <a href="http://www.blogjava.net/boluobn/articles/136156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ant中文教程</title><link>http://www.blogjava.net/boluobn/articles/135078.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Tue, 07 Aug 2007 13:29:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/135078.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/135078.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/135078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/135078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/135078.html</trackback:ping><description><![CDATA[还不是很全，只有基本的内容：<br>1 Ant是什么？ <br>Apache Ant 是一个基于 Java的生成工具。<br>生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式（也有可能转换为可安装的产品映像形式）。随着应用程序的生成过程变得更加复杂，确保在每次生成期间都使用精确相同的生成步骤，同时实现尽可能多的自动化，以便及时产生一致的生成版本<br>2 下载、安装Ant <br>安装Ant<br>下载.zip文件，解压缩到c:\ant1.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的ant.jar文件放到JDK/JRE的lib/ext目录下。Ant是个应用程序，而lib/ext目录是为JDK扩展使用的（如JCE，JSSE扩展）。而且通过扩展装入的类会有安全方面的限制。<br>2.2 运行Ant <br><br>运行Ant非常简单，当你正确地安装Ant后，只要输入ant就可以了。<br><br>? 没有指定任何参数时，Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为buildfile。如果你用 -find 选项。Ant就会在上级目录中寻找buildfile，直至到达文件系统的根。要想让Ant使用其他的buildfile，可以用参数 -buildfile file，这里file指定了你想使用的buildfile。<br><br>? 可以指定执行一个或多个target。当省略target时，Ant使用标签&lt;project&gt;的default属性所指定的target。<br><br><br>命令行选项总结：<br>ant [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>ant<br>使用当前目录下的build.xml运行Ant，执行缺省的target。<br>ant -buildfile test.xml<br>使用当前目录下的test.xml运行Ant，执行缺省的target。<br>ant -buildfile test.xml dist<br>使用当前目录下的test.xml运行Ant，执行一个叫做dist的target。<br>ant -buildfile test.xml -Dbuild=build/classes dist<br>使用当前目录下的test.xml运行Ant，执行一个叫做dist的target，并设定build属性的值为build/classes。<br><br>3 编写build.xml <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>ant.file buildfile的绝对路径。<br>ant.version Ant的版本。<br>ant.project.name 当前执行的project的名字；由&lt;project&gt;的name属性设定.<br>ant.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/ant.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="**/ant.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=".;./xml-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=&#8221;my.mf&#8221;<br>/&gt;<br>manifest属性指定自己的META-INF/MANIFEST.MF文件，而不是由系统生成<br>4.3.2 war<br>? 对Jar的扩展，用于打包Web应用<br>? 例子：<br>? 假设我们的文件目录如下：<br>thirdparty/libs/jdbc1.jar<br>thirdparty/libs/jdbc2.jar<br>build/main/com/myco/myapp/Servlet.class<br>src/metadata/myapp.xml<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" webxml="src/metadata/myapp.xml"&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="jdbc1.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.xml<br>WEB-INF/lib/jdbc2.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" appxml="${src.dir}/metadata/application.xml"&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>? 通过jdbc执行SQL语句<br>? 例子：<br>1. &lt;sql<br>driver="org.gjt.mm.mysql.Driver"<br>url="jdbc:mysql://localhost:3306/mydb"<br>userid="root"<br>password="root"<br>src="data.sql"<br>/&gt;<br>2. &lt;sql<br>driver="org.database.jdbcDriver"<br>url="jdbc: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/boluobn/aggbug/135078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-07 21:29 <a href="http://www.blogjava.net/boluobn/articles/135078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ant十五大最佳实践</title><link>http://www.blogjava.net/boluobn/articles/134828.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Mon, 06 Aug 2007 15:53:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134828.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134828.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134828.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134828.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134828.html</trackback:ping><description><![CDATA[<table style="WORD-BREAK: break-all" cellSpacing=0 cellPadding=0 width=700 align=center border=0>
    <tbody>
        <tr>
            <td align=middle height=25><font face=黑体 size=4></font></td>
        </tr>
        <tr bgColor=#f9f9f9>
            <td id=fontzoom style="LINE-HEIGHT: 200%">
            <p align=center>作者：Eric M. Burke &nbsp;&nbsp;&nbsp;&nbsp;来自：onjava</p>
            <p>　　在 <a href="http://www.javafan.net/special/ant/index.jsp" target=_blank><u><font color=#0000ff>Ant</font></u></a> 出现之前，构建和部署Java应用需要使用包括特定平台的脚本、Make文件、各种版本的IDE甚至手工操作的&#8220;大杂烩&#8221;。现在，几乎所有的开源Java项目都在使用Ant，大多数公司的内部项目也在使用Ant。Ant在这些项目中的广泛使用自然导致了读者对一整套Ant最佳实践的迫切需求。</p>
            <p>　　本文总结了我喜爱的Ant技巧或最佳实践，多数是从我亲身经历的项目错误或我听说的其他人经历的 &#8220;恐怖&#8221;故事中得到灵感的。比如，有人告诉我有个项目把XDoclet 生成的代码放入带有锁定文件功能的版本控制工具中。当开发者修改源代码时，他必须记住手工检出（Check out）并锁定所有将要重新生成的文件。然后，手工运行代码生成器，只到这时他才能够让Ant编译代码，这一方法还存在如下一些问题：</p>
            <p>　　□ 生成的代码无法存储在版本控制系统中。 <br>　　□ Ant（本案例中是Xdoclet）应该自动确定下一次构建涉及的源文件，而不应由程序员手工确定。 <br>　　□ Ant的构建文件应该定义好正确的任务依赖关系，这样程序员就不必为了完成构建而不得不按照特定顺序调用任务。 </p>
            <p>　　当我开始一个新项目时，我首先编写Ant构建文件。Ant文件明确地定义构建的过程，并被团队中的每个程序员使用。本文所列的技巧基于这样的假定：Ant构建文件是一个必须仔细编写的重要文件，它应在版本控制系统中得到维护，并被定期进行重构。下面是我的十五大Ant最佳实践。</p>
            <p>　　<strong>1. 采用一致的编码规范</strong></p>
            <p>　　Ant用户有的喜欢有的痛恨其构建文件的XML语法。与其跳进这一令人迷惑的争论中，不如让我们先看一些能保持XML构建文件简洁的方法。</p>
            <p>　　首先也是最重要的，花费时间格式化你的XML让它看上去很清晰。不论XML是否美观，Ant都可以工作。但是丑陋的XML很难令人读懂。倘若你在任务之间留出空行，有规则的缩进，每行文字不超过90列左右，那么XML令人惊讶地易读。再加上使用能够高亮XML语法的优秀编辑器或IDE工具，你就不会有阅读的麻烦。</p>
            <p>　　同样，精选含意明确、容易读懂的词汇来命名任务和属性。比如，dir.reports就比rpts好。特定的编码规范并不重要，只要拿出一套规范并坚持使用就行。</p>
            <p>　　<strong>2. 将build.xml放在项目根目录中</strong></p>
            <p>　　Ant构建文件build.xml可以放在任何位置，但是放在项目顶级目录中可以保持项目简洁。这是最常用的规范，开发者能够在顶级目录中找到预期的build.xml。把构建文件放在根目录中，也能够使人容易了解项目目录树中不同目录之间的逻辑关系。以下是一个典型的项目目录层次：</p>
            <p style="BACKGROUND: #eeeeee">[root dir]<br>&nbsp; | build.xml&nbsp; <br>&nbsp; +--src <br>&nbsp; +--lib (包含第三方 JAR包) <br>&nbsp; +--build (由 build任务生成)&nbsp; <br>&nbsp; +--dist (由 build任务生成) </p>
            <p>　　当build.xml在顶级目录时，假设你处于项目某个子目录中，只要输入：ant -find compile 命令，不需要改变工作目录就能够以命令行方式编译代码。参数-find告诉Ant寻找存在于上级目录中的build.xml并执行。</p>
            <p>　　<strong>3. 使用单一的构建文件</strong></p>
            <p>　　有人喜欢将一个大项目分解成几个小的构建文件，每个构建文件分担整个构建过程的一小部分工作。这确实是看法不同的问题，但是应该认识到，将构建文件分割会增加对整体构建过程的理解难度。要注意在单一构建文件能够清楚表现构建层次的情况下不要过工程化(over-engineer)。</p>
            <p>　　即使你把项目划分为多个构建文件，也应使程序员能够在项目根目录下找到核心build.xml。尽管该文件只是将实际构建工作委派给下级构建文件，也应保证该文件可用。</p>
            <p>　　<strong>4. 提供良好的帮助说明</strong></p>
            <p>　　应尽量使构建文件自文档化。增加任务描述是最简单的方法。当你输入ant -projecthelp时，你就可以看到带有描述的任务清单。比如，你可以这样定义任务：</p>
            <p style="BACKGROUND: #eeeeee">&lt;target name="compile"&nbsp; <br>&nbsp;&nbsp; description="Compiles code, output goes to the build dir."&gt; </p>
            <p>　　最简单的规则是把所有你想让程序员通过命令行就可以调用的任务都加上描述。对于一般用来执行中间处理过程的内部任务，比如生成代码或建立输出目录等，就无法使用描述属性。</p>
            <p>　　这时，可以通过在构建文件中加入XML注释来处理。或者专门定义一个help任务，当程序员输入ant help时来显示详细的使用说明。</p>
            <p style="BACKGROUND: #eeeeee">&lt;target name="help" description="Display detailed usage information"&gt;<br>&nbsp; &lt;echo&gt;Detailed help...&lt;/echo&gt;&lt;/target&gt; </p>
            <p>　　<strong>5. 提供清除任务</strong></p>
            <p>　　每个构建文件都应包含一个清除任务，用来删除所有生成的文件和目录，使系统回到构建文件执行前的初始状态。执行清空任务后还存在的文件都应处在版本控制系统的管理之下。比如：</p>
            <p style="BACKGROUND: #eeeeee">&lt;target name="clean" <br>&nbsp;&nbsp;&nbsp; description="Destroys all generated files and dirs."&gt;<br>&nbsp; &lt;delete dir="${dir.build}"/&gt;<br>&nbsp; &lt;delete dir="${dir.dist}"/&gt;<br>&lt;/target&gt; </p>
            <p>　　除非是在产生整个系统版本的特殊任务中，否则不要自动调用clean任务。当程序员仅仅执行编译任务或其他任务时，他们不需要构建文件事先执行既令人讨厌又没有必要的清空任务。要相信程序员能够确定何时需要清空所有文件。</p>
            <p>　　<strong>6. 使用ANT管理任务从属关系</strong></p>
            <p>　　假设你的应用由Swing GUI组件、Web界面、EJB层和公共应用代码组成。在大型系统中，你需要清晰地定义每个Java包属于系统的哪一层。否则任何一点修改都要被迫重新编译成百上千个文件。糟糕的任务从属关系管理会导致过度复杂而脆弱的系统。改变GUI面板的设计不应造成Servlet和EJB的重编译。</p>
            <p>　　当系统变得庞大后，稍不注意就可能将依赖于客户端的代码引入到服务端。这是因为典型的IDE项目文件编译任何文件都使用单一的classpath。而Ant能让你更有效地控制构建活动。</p>
            <p>　　设计你的Ant构建文件编译大型项目的步骤：首先，编译公共应用代码，将编译结果打成JAR包文件。然后，编译上一层的项目代码，编译时依靠第一步产生的JAR文件。不断重复这一过程，直到最高层的代码编译完成。</p>
            <p>　　分步构建强化了任务从属关系管理。如果你工作在底层Java框架上，偶然引用到高层的GUI模板组件，这时代码不需要编译。这是由于构建文件在编译底层框架时在源路径中没有包含高层GUI面板组件的代码。</p>
            <p>　　<strong>7. 定义并重用文件路径</strong></p>
            <p>　　如果文件路径在一个地方一次性集中定义，并在整个构建文件中得到重用，那么构建文件更易于理解。以下是这样做的一个例子：</p>
            <p style="BACKGROUND: #eeeeee">&lt;project name="sample" default="compile" basedir="."&gt;<br>&nbsp; &lt;path id="classpath.common"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;pathelement location="${jdom.jar.withpath}"/&gt;<br>&nbsp;&nbsp;&nbsp; ...etc&nbsp; &lt;/path&gt;<br>&nbsp; &lt;path id="classpath.client"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;pathelement location="${guistuff.jar.withpath}"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;pathelement location="${another.jar.withpath}"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;!-- reuse the common classpath --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;path refid="classpath.common"/&gt;<br>&nbsp; &lt;/path&gt;<br>&nbsp; &lt;target name="compile.common" depends="prepare"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;javac destdir="${dir.build}" srcdir="${dir.src}"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;classpath refid="classpath.common"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;include name="com/oreilly/common/**"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/javac&gt;<br>&nbsp; &lt;/target&gt;<br>&lt;/project&gt; </p>
            <p>　　当项目不断增长构建日益复杂时，这一技术越发体现出其价值。你可能需要为编译不同层次的应用定义各自的文件路径，比如运行单元测试的、运行应用程序的、运行Xdoclet的、生成JavaDocs的等等不同路径。这种组件化路径定义的方法比为每个任务单独定义路径要优越得多。否则，很容易丢失任务从属关系的轨迹。</p>
            <p>　　<strong>8. 定义恰当的任务从属关系</strong></p>
            <p>　　假设dist任务从属于jar任务，那么哪个任务从属于compile任务哪个任务从属于prepare任务呢？Ant构建文件最终定义了任务的从属关系图，它必须被仔细地定义和维护。</p>
            <p>　　应该定期检查任务的从属关系以保证构建工作得到正确执行。大的构建文件随着时间推移趋向于增加更多的任务，所以到最后可能由于不必要的从属关系导致构建工作非常困难。比如，你可能发现在程序员只需编译一些没有使用EJB的GUI代码时又重新生成了EJB代码。</p>
            <p>　　以&#8220;优化&#8221;的名义忽略任务的从属关系是另一种常见的错误。这种错误迫使程序员为了得到恰当的结果必须记住并按照特定的顺序调用一串任务。更好的做法是：提供描述清晰的公共任务，这些任务包含正确的任务从属关系；另外提供一套&#8220;专家&#8221;任务让你能够手工执行个别的构建步骤，这些任务不提供完整的构建过程，但是让那些专家用户在快速而恼人的编码期间能够跳过某些步骤。</p>
            <p>　　<strong>9.使用属性</strong></p>
            <p>　　任何需要配置或可能发生变化的信息都应作为Ant属性定义下来。对于在构建文件中多次出现的值也同样处理。属性既可以在构建文件头部定义，也可以为了更好的灵活性而在单独的属性文件中定义。以下是在构建文件中定义属性的样式：</p>
            <p style="BACKGROUND: #eeeeee">&lt;project name="sample" default="compile" basedir="."&gt;<br>&nbsp; &lt;property name="dir.build" value="build"/&gt;<br>&nbsp; &lt;property name="dir.src" value="src"/&gt;<br>&nbsp; &lt;property name="jdom.home" value="../java-tools/jdom-b8"/&gt;<br>&nbsp; &lt;property name="jdom.jar" value="jdom.jar"/&gt;<br>&nbsp; &lt;property name="jdom.jar.withpath"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="${jdom.home}/build/${jdom.jar}"/&gt;<br>&nbsp;&nbsp;&nbsp; etc...<br>&lt;/project&gt; </p>
            <p>　　或者你可以使用属性文件：</p>
            <p style="BACKGROUND: #eeeeee">&lt;project name="sample" default="compile" basedir="."&gt;<br>&nbsp; &lt;property file="sample.properties"/&gt;<br>&nbsp;&nbsp; etc...<br>&lt;/project&gt; </p>
            <p>　　在属性文件 sample.properties中:</p>
            <p style="BACKGROUND: #eeeeee">dir.build=build<br>dir.src=src<br>jdom.home=../java-tools/jdom-b8<br>jdom.jar=jdom.jarjdom.jar.withpath=${jdom.home}/build/${jdom.jar} </p>
            <p>　　用一个独立的文件定义属性是有好处的，它可以清晰地定义构建中的可配置部分。另外，在开发者工作在不同操作系统的情况下，你可以在不同的平台上提供该文件的不同版本。</p>
            <p>　　<strong>10. 保持构建过程独立</strong></p>
            <p>　　为了最大限度的扩展性，不要应用外部路径和库文件。最重要的是不要依赖于程序员的CLASSPATH设置。取而代之的是，在构建文件中使用相对路径并定义自己的路径。如果你引用了绝对路径如C:\java\tools，其他开发者未必使用与你相同的目录结构，所以就无法使用你的构建文件。</p>
            <p>　　如果你部署开放源码项目，应该提供包含编译代码所需的所有JAR文件的发行版本。当然，这是在遵守许可协议的基础上。对于内部项目，相关的JAR文件都应在版本控制系统的管理中，并捡出（check out）到大家都知道的位置。</p>
            <p>　　当你必须引用外部路径时，应将路径定义为属性。使程序员能够用适合他们自己的机器环境的参数重载这些属性。你也可以使用以下语法引用环境变量：</p>
            <p style="BACKGROUND: #eeeeee">&lt;property environment="env"/&gt;<br>&lt;property name="dir.jboss" value="${env.JBOSS_HOME}"/&gt; </p>
            <p>　　<strong>11. 使用版本控制系统</strong></p>
            <p>　　构建文件是一个重要的制品，应该像代码一样进行版本控制。当你标记你的代码时，也应用同样的标签标记构建文件。这样当你需要回溯到旧版本并进行构建时，能够使用相应版本的构建文件。</p>
            <p>　　除构建文件之外，你还应在版本控制中维护第三方JAR文件。同样，这使你能够重新构建旧版本的软件。这也能够更容易保证所有开发者拥有一致的JAR文件，因为他们都是同构建文件一起从版本控制系统中捡出的。</p>
            <p>　　通常应避免在版本控制系统中存放构建成果。倘若你的源代码很好地得到了版本控制，那么通过构建过程你能够重新生成任何版本的产品。</p>
            <p>　　<strong>12. 把Ant作为&#8220;最小公分母&#8221;</strong></p>
            <p>　　假设你的开发团队使用IDE工具，当程序员通过点击图标就能够构建整个应用时为什么还要为Ant而烦恼呢？</p>
            <p>　　IDE的问题是一个关于团队一致性和重现性的问题。几乎所有的IDE设计初衷都是为了提高程序员的个人生产率，而不是开发团队的持续构建。典型的IDE要求每个程序员定义自己的项目文件。程序员可能拥有不同的目录结构，可能使用不同版本的库文件，还可能工作在不同的平台上。这将导致出现这种情况：在Bob那里运行良好的代码，到Sally那里就无法运行。</p>
            <p>　　不管你的开发团队使用何种IDE，一定要建立所有程序员都能够使用的Ant构建文件。要建立一个程序员在将新代码提交版本控制系统前必须执行Ant构建文件的规则。这将确保代码是经过同一个Ant构建文件构建的。当出现问题时，要使用项目标准的Ant构建文件，而不是通过某个IDE来执行一个干净的构建。</p>
            <p>　　程序员可以自由选择任何他们习惯使用的IDE工具或编辑器。但是Ant应作为公共基线以保证代码永远是可构建的。</p>
            <p>　　<strong>13. 使用zipfileset属性</strong></p>
            <p>　　人们经常使用Ant产生WAR、JAR、ZIP和 EAR文件。这些文件通常都要求有一个特定的内部目录结构，但其往往与你的源代码和编译环境的目录结构不匹配。</p>
            <p>　　一个最常用的方法是写一个Ant任务，按照期望的目录结构把一大堆文件拷贝到临时目录中，然后生成压缩文件。这不是最有效的方法。使用zipfileset属性是更好的解决方案。它让你从任何位置选择文件，然后把它们按照不同目录结构放进压缩文件中。以下是一个例子：</p>
            <p style="BACKGROUND: #eeeeee">&lt;ear earfile="${dir.dist.server}/payroll.ear"<br>&nbsp;&nbsp;&nbsp; appxml="${dir.resources}/application.xml"&gt;<br>&nbsp; &lt;fileset dir="${dir.build}" includes="commonServer.jar"/&gt;<br>&nbsp; &lt;fileset dir="${dir.build}"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;include name="payroll-ejb.jar"/&gt;<br>&nbsp; &lt;/fileset&gt;<br>&nbsp; &lt;zipfileset dir="${dir.build}" prefix="lib"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;include name="hr.jar"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;include name="billing.jar"/&gt;<br>&nbsp; &lt;/zipfileset&gt;<br>&nbsp; &lt;fileset dir="."&gt;<br>&nbsp;&nbsp;&nbsp; &lt;include name="lib/jdom.jar"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;include name="lib/log4j.jar"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;include name="lib/ojdbc14.jar"/&gt;<br>&nbsp; &lt;/fileset&gt;<br>&nbsp; &lt;zipfileset dir="${dir.generated.src}" prefix="META-INF"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;include name="jboss-app.xml"/&gt;<br>&nbsp; &lt;/zipfileset&gt;<br>&lt;/ear&gt; </p>
            <p>　　在这个例子中，所有JAR文件都放在EAR文件包的lib目录中。hr.jar和billing.jar是从构建目录拷贝过来的。因此我们使用zipfileset属性把它们移动到EAR文件包内部的lib目录。prefix属性指定了其在EAR文件中的目标路径。</p>
            <p>　　<strong>14. 测试Clean任务</strong></p>
            <p>　　假设你的构建文件中有clean和compile的任务，执行以下的测试。第一步，执行ant clean；第二步，执行ant compile；第三步，再执行ant compile。第三步应该不作任何事情。如果文件再次被编译，说明你的构建文件有问题。</p>
            <p>　　构建文件应该只在与输出文件相关联的输入文件发生变化时执行任务。一个构建文件在不必执行诸如编译、拷贝或其他工作任务的时候执行这些任务是低效的。当项目规模增长时，即使是小的低效工作也会成为大的问题。</p>
            <p>　　<strong>15. 避免特定平台的Ant封装</strong></p>
            <p>　　不管什么原因，有人喜欢用简单的、名称叫做compile之类的批文件或脚本装载他们的产品。当你去看脚本的内容你会发现以下内容：</p>
            <p style="BACKGROUND: #eeeeee">　　ant compile</p>
            <p>　　其实开发人员都很熟悉Ant，并且完全能够自己键入ant compile。请不要仅仅为了调用Ant而使用特定平台的脚本。这只会使其他人在首次使用你的脚本时增加学习和理解的烦扰。除此之外，你不可能提供适用于每个操作系统的脚本，这是真正烦扰其他用户的地方。</p>
            <p>　　<strong>总结</strong></p>
            <p>　　太多的公司依靠手工方法和特别程序来编译代码和生成软件发布版本。那些不使用Ant或类似工具定义构建过程的开发团队，花费了太多的时间来捕捉代码编译过程中出现的问题：在某些开发者那里编译成功的代码，到另一些开发者那里却失败了。</p>
            <p>　　生成并维护构建脚本不是一项富有魅力的工作，但却是一项必需的工作。一个好的Ant构建文件将使你能够集中到更喜欢的工作——写代码中去！</p>
            <p>　　<strong>参考</strong></p>
            <p>　　☆ <a href="http://ant.apache.org/" target=_blank><u><font color=#0000ff>http://ant.apache.org/</font></u></a>&nbsp; Ant<br>　　☆ <a href="http://www.ericburke.com/" target=_blank><u><font color=#0000ff>http://www.ericburke.com/</font></u></a>&nbsp; AntGraph: Ant依赖性的可视化工具 <br>　　☆ <a href="http://www.oreilly.com/catalog/anttdg/index.html?CMP=IL7015" target=_blank><u><font color=#0000ff>http://www.oreilly.com/catalog/anttdg/index.html?CMP=IL7015</font></u></a>&nbsp; Ant: The Definitive Guide, O'Reilly <br>　　☆ <a href="http://www.oreilly.com/catalog/jextprockbk/index.html?CMP=IL7015" target=_blank><u><font color=#0000ff>http://www.oreilly.com/catalog/jextprockbk/index.html?CMP=IL7015</font></u></a>&nbsp; Java Extreme Programming Cookbook, O'Reilly</p>
            <p>　　原文：<a href="http://www.onjava.com/pub/a/onjava/2003/12/17/ant_bestpractices.html" target=_blank><u><font color=#0000ff>http://www.onjava.com/pub/a/onjava/2003/12/17/ant_bestpractices.html</font></u></a><br>　　翻译：徐彤 MSN:xt121@hotmail.com</p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/boluobn/aggbug/134828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-06 23:53 <a href="http://www.blogjava.net/boluobn/articles/134828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>