本文轉(zhuǎn):http://blog.csdn.net/happlyin/archive/2003/10/25/18308.aspx
本文結(jié)合一個(gè)簡(jiǎn)單示例講解了怎樣把Axis和Ant結(jié)合起來(lái)進(jìn)行Web服務(wù)的開(kāi)發(fā)。幫助讀者從簡(jiǎn)單的java源代碼或者從一個(gè)服務(wù)描述文件(wsdl)開(kāi)始,用Ant工具進(jìn)行構(gòu)建,設(shè)置,并把服務(wù)部署到Axis。
?
首先假定您熟悉 AXIS 處理系統(tǒng)和Ant工具。文中示例所需要的軟件如下:
l???????? Apache Axis 1.1
l???????? Apache Ant 1.5.3
l???????? Jarkat Tomcat 4.1.24
在開(kāi)始前,假定上述軟件已經(jīng)安裝和配置好了。
?
Axis和Ant簡(jiǎn)介
Axis 框架是來(lái)自 Apache Group 的、基于 java 的、最新的 SOAP 規(guī)范(SOAP 1.2)和 SOAP with Attachments 規(guī)范(來(lái)自 Apache Group )的開(kāi)放源代碼實(shí)現(xiàn)。其本質(zhì)上是一個(gè)SOAP引擎--一個(gè)構(gòu)建諸如客戶端、服務(wù)器、網(wǎng)關(guān)等SOAP處理器的框架。是Apache SOAP的后繼項(xiàng)目。但是,Axis使用SAX(基于事件)解析器獲得了比Apache SOAP早期版本(使用DOM解析)非常明顯的速度優(yōu)勢(shì)。另外,它還具有很強(qiáng)的靈活性和穩(wěn)定性,支持Web服務(wù)描述語(yǔ)言1.1版。
Apache Ant是Apache軟件基金會(huì)jakarta項(xiàng)目中的一個(gè)子項(xiàng)目,是一個(gè)基于Java的構(gòu)建工具,類似于make,但它沒(méi)有make那么復(fù)雜繁瑣。Ant由一些內(nèi)置任務(wù)(task)和可選擇的任務(wù)組成,還可以配置第三方提供的任務(wù)。它的構(gòu)建配置文件基于XML的,所以容易書寫和維護(hù),而且結(jié)構(gòu)清晰。Ant還可以集成到一些開(kāi)發(fā)環(huán)境中(例如visual age,jbuilder,Elipse)。
?
Axis對(duì)Ant的支持
Axis為支持Ant構(gòu)建,提供了一個(gè)axis-ant.jar文件。該文件包含三個(gè)可選任務(wù)(task)的定義和實(shí)現(xiàn):axis-wsdl2java,axis-java2wsdl和axis-admin。任務(wù)axis-wsdl2java與Axis提供的工具WSDL2Java具有同樣的功能,根據(jù)web服務(wù)描述文件生成對(duì)應(yīng)的Java源程序,它的屬性設(shè)置與WSDL2Java的命令參數(shù)設(shè)置類似。而任務(wù)axis-java2wsdl則相反,它與Java2WSDL工具一樣,是根據(jù)已有的類文件來(lái)生成Web服務(wù)描述文件。最后一個(gè)任務(wù)axis-admin是用于web服務(wù)的部署和取消部署的,對(duì)應(yīng)于Axis的AminClient工具。
為了使Ant能夠正確使用上述三個(gè)任務(wù)(task),還需要做一些配置。注意:Apache Ant的版本必須是1.5.1或更高版本。
1.設(shè)置系統(tǒng)的環(huán)境變量CLASSPATH包含Axis提供的axis-ant.jar文件,或者在Ant的配置文件(通常是build.xml)中設(shè)置路徑包含它。例如,
??? <path id="axis.classpath">
? ??? <fileset dir="${axis.home}/lib">
??? ?????? ????<include name="**/*.jar" />
????? </fileset>
??? </path>
???
2.然后使用<taskdef>聲明導(dǎo)入axis-ant.jar文件中的屬性文件所定義的任務(wù)(task)列表。
??? <taskdef resource="axis-tasks.properties"
? classpathref="axis.classpath" />
? ?? 3.設(shè)置在構(gòu)建過(guò)程中可能要需要的java包,例如,Axis所有的jar包,wsdl4j.jar,junit.jar等等。
?
實(shí)例開(kāi)發(fā)
下面就用一個(gè)實(shí)例來(lái)講解怎樣把Ant和Axis結(jié)合來(lái)開(kāi)發(fā)Web服務(wù)。為了注重本文的目的,我們開(kāi)發(fā)一個(gè)比較簡(jiǎn)單的Web服務(wù),它接受客戶端傳入的字符串?dāng)?shù)組,如果傳入的參數(shù)為null,則拋出一個(gè)自定義的異常,否則把每個(gè)字符串連接起來(lái)返回給客戶端。
首先定義一個(gè)Web服務(wù)接口Hello,如下所示:
?
? package com.bidlink.hello;
? public interface Hello{
???? public String echo(String[] content ) throws???????????????????? ??
?????????????? java.rmi.RemoteException,com.bidlink.hello.MyException;
? }
?
? 自定義異常MyException包含一個(gè)時(shí)間值,以記錄異常出現(xiàn)的時(shí)間,如下:
?
? package com.bidlink.hello;
public class MyException extends org.apache.axis.AxisFault implements java.io.Serializable{
??? private java.util.Calendar occurTime;
???
??? public MyException() {
??? }
?
??? public MyException(
?????????? java.util.Calendar occurTime) {
??????? super();
??????? this.occurTime = occurTime;
??? }
?
??? public java.util.Calendar getOccurTime() {
??????? return occurTime;
??? }
?
??? public void setOccurTime(java.util.Calendar occurTime) {
??????? this.occurTime = occurTime;
??? }???????????
}
?
1.axis-java2wsdl:從類文件生成服務(wù)描述文件
編譯上面定義的兩個(gè)文件Hell.java和MyException.java。接著編寫Ant的配置文件build.xml(文件詳細(xì)信息請(qǐng)查看示例源代碼),使用axis-java2wsdl任務(wù)根據(jù)類Hello來(lái)生成Web服務(wù)描述文件hello.wsdl。任務(wù)具體配置如下:
??? <axis-java2wsdl classname="com.bidlink.hello.Hello"
??????????????????????? location="http://localhost:8080/axis/services/Hello"
??????????????????????? namespace="http://hello.bidlink.com"
??????????????????????? output="hello.wsdl"
??????????????????????? style="RPC"
??????????????????????? extraclasses="com.bidlink.hello.MyException">
??? ?????<classpath>
???????????? <pathelement path="${dist}"/>
???????? </classpath>
??????? </axis-java2wsdl>
???????
其中,<pathelement path="${dist}"/>指出Hello.class和MyException.class文件的位置。
運(yùn)行命令ant java2wsdl,構(gòu)建出Web服務(wù)描述文件hello.wsdl。
2.axis-wsdkl2java:從服務(wù)描述文件生成服務(wù)源程序
下面講解怎樣根據(jù)剛剛得到的hello.wsdl文件生成服務(wù)所需要的java源程序。在這里需要用到任務(wù)axis-wsdl2java。任務(wù)屬性設(shè)置如下:
???? <axis-wsdl2java all="true"
?? ?????????????? ???url="hello.wsdl"
??? ????????????? ???deployscope="Request"
??? ????????????? ???output="${gensrc}"
??? ????????????? ???serverside="true"
??? ????????????? ???skeletondeploy="false"
??? ????????????? ???testcase="true"
??? ????????????? ???noimports="false"
??? ????????????? ???typemappingversion="1.2">
???????
??????? </axis-wsdl2java>
? ??? 運(yùn)行ant wsdl2java,根據(jù)axis-wsdl2java任務(wù)的屬性配置生成相應(yīng)的java源程序,本例所生成的文件包括:服務(wù)端服務(wù)接口文件Hello.java及其實(shí)現(xiàn)HelloSoapBindingImpl.java,以及客戶端的HelloService.java,HelloServiceLocator.java,HelloServiceLocator.java和客戶端存根文件HelloSoapBindingStub.java。又因?yàn)閷傩?/span>testcase="true",所以還生成了測(cè)試文件HelloServiceTestCase.java。當(dāng)然,自定義異常MyException也是重新生成的。
3.axis-admin:向Axis部署Hello服務(wù)
服務(wù)源程序生成后,需要根據(jù)服務(wù)的功能修改HelloSoapBindingImpl.java文件,以真正實(shí)現(xiàn)該Web服務(wù)。修改如下:
? /**
?* HelloSoapBindingImpl.java
?*
?* This file was auto-generated from WSDL
?* by the Apache Axis WSDL2Java emitter.
?*/
?
package com.bidlink.hello;
?
public class HelloSoapBindingImpl implements com.bidlink.hello.Hello{
??? public java.lang.String echo(java.lang.String[] in0) throws java.rmi.RemoteException, com.bidlink.hello.MyException {
??????? if(in0 == null)
?????????? throw new MyException(java.util.Calendar.getInstance());
??????????
???????
??????? String retStr = "";
??????? for(int i=0; i< in0.length; i++)
?????????? retStr += in0[i];
??????? return retStr;
??? }
?
}
???
編譯所有的生成的源程序,最后使用axis-admin任務(wù)向Axis部署Hello Web服務(wù)。
??? <axis-admin
?????? ??? port="${target.port}"
??? ?????? ????hostname="${target.server}"
??????????? failonerror="true"
??????????? servletpath="${target.appname}/services/AdminService"
??????????? debug="true"
??????????? xmlfile="deploy.wsdd"/>
?????? 運(yùn)行ant deploy,部署Hello服務(wù)。
?? ?測(cè)試
現(xiàn)在可以測(cè)試所部署的Web服務(wù)hello。可以通過(guò)瀏覽器,也可以利用剛才生成的測(cè)試文件HelloServiceTestCase.java來(lái)進(jìn)行該項(xiàng)工作。如果利用測(cè)試文件HelloServiceTestCase.java,那么還需要對(duì)它進(jìn)行稍作修改。具體來(lái)說(shuō),就是添加一個(gè)main函數(shù),然后修改所生成的測(cè)試方法。
??
參考資料
1.閱讀Apache Axis開(kāi)發(fā)指導(dǎo)文檔
2.查看Apache Ant文檔手冊(cè)http://ant.apache.org/manual/index.html
3.http://nagoya.apache.org/wiki/apachewiki.cgi?AxisProjectPages/AxisAntTasks得到更多關(guān)于Axis-Ant任務(wù)的信息。