版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433575
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