axis2:用ant脚本生成webservice client 端的java/c代码

来源:互联网 发布:歼31黑烟知乎 编辑:程序博客网 时间:2024/06/08 10:15

Axis2是下一代 Apache Axis。Axis2 虽然由 Axis 1.x 处理程序模型提供支持,但它具有更强的灵活性并可扩展到新的体系结构。Axis2 基于新的体系结构进行了全新编写,而且没有采用 Axis 1.x 的常用代码。支持开发 Axis2 的动力是探寻模块化更强、灵活性更高和更有效的体系结构,这种体系结构可以很容易地插入到其他相关 Web 服务标准和协议(如 WS-Security、WS-ReliableMessaging 等)的实现中。@百度百科
axis2是什么不是本文的重点,本文要说的是当我们用axis2已经搭架了一个webservice服务器可以对外部世界提供服务的时候,客户端访问webservice的代码怎么生成?
axis2提供了根据wsdl文件生成java和c代码的工具(Code Generator Tool),利用自动生成的client代码的好处不言而喻,可以大大减少client开发的工作量。
使用Code Generator Tool可以生成java或c代码。同时为了方便在ant下调用,axis2还提供了名为AntCodegenTask的ant task,用它可以很方便的在ant脚本中生成你的webservice client代码。
以下是ant脚本中用AntCodegenTask生成java代码的示例:

    <property environment="env" />    <!--从环境变量AXIS2_HOME中读取axis2的位置-->    <property name="AXIS2_HOME" value="${env.AXIS2_HOME}" />    <path id="axis2.classpath">        <!--默认的AXIS2 jar包-->        <fileset dir="${AXIS2_HOME}/lib">            <include name="*.jar" />        </fileset>    </path>    <!--用AntCodegenTask类定义名为codegen的task,用于client代码生成-->    <taskdef name="codegen" classname="org.apache.axis2.tool.ant.AntCodegenTask" classpathref="axis2.classpath" />    <!--生成客户端java代码-->    <target name="client.java" depends="wsdl" description="生成webservice 客户端代码(java)">        <echo>从${package-name}.wsdl生成webservice client 代码(java)</echo>        <delete includeEmptyDirs="true" dir="${client.java.dir}" />        <!--执行codegen生成代码-->        <codegen wsdlfilename="${wsdl.dir}/${package-name}.wsdl" databindingName="adb" output="${client.java.dir}" language="java" packageName="${client-package}" />    </target>

其实如果你看过axis2的源码,AntCodegenTask最终是调用org.apache.axis2.wsdl.codegen.CodeGenerationEngine(代码生成引擎)来实现代码生成,为了支持直接从命令行生成client代码,axis2还提供了一个org.apache.axis2.wsdl.WSDL2Code实现与AntCodegenTask同样的功能,不同的只是它不依赖ant,有main方法可以独立执行。为了简化调用基于WSDL2Code,又提供了WSDL2C和WSDL2Java两个类,因为代码非常简单,这里贴出代码

WSDL2Java.java

package org.apache.axis2.wsdl;public class WSDL2Java {    public static void main(String[] args) throws Exception {        WSDL2Code.main(args);    }}

WSDL2C.java

package org.apache.axis2.wsdl;public class WSDL2C {    public static void main(String[] args) throws Exception {        String[] cargs = new String[args.length + 2];        System.arraycopy(args, 0, cargs, 0, args.length);        System.setProperty("org.apache.adb.properties",                           "/org/apache/axis2/schema/c-schema-compile.properties");        cargs[args.length] = "-l";        cargs[args.length + 1] = "c";        WSDL2Code.main(cargs);    }}

so,如果不使用现成的AntCodegenTask,也可以直接执行WSDL2Code或WSDL2C或WSDL2Java生成你需要的代码,你可以利用WSDL2Code在shell脚本中完成client代码生成。
以下是用WSDL2C生成webservice client c代码的ant脚本示例:

    <path id="service.classpath">        <path refid="axis2.classpath" />        <path refid="lib.classpath" />        <path refid="project.classpath" />    </path>    <!--生成客户端c代码-->    <target name="client.c" depends="wsdl" description="生成webservice 客户端代码(c)">        <echo>${package-name}.wsdl生成webservice client 代码(c)</echo>        <delete includeEmptyDirs="true" dir="${client.c.dir}" />        <java classname="org.apache.axis2.wsdl.WSDL2C" fork="true">            <classpath refid="service.classpath" />            <arg value="-uri" />            <arg value="${wsdl.dir}/${package-name}.wsdl" />            <arg value="-o" />            <arg value="${client.c.dir}" />            <arg value="-d" />            <arg value="adb" />            <arg value="-u"/>        </java>    </target>

不论是用现成的AntCodegenTask,还是用WSDL2Code或WSDL2C或WSDL2Java,关于参数的说明都请参见CodegenToolReference

0 0