Apache Woden 1.0M10 快速入门与集成示例

以 Maven Central 实测版本 Apache Woden 1.0M10(woden-core)为基线,给出 10 分钟跑通的 WSDL 2.0 解析最小示例、依赖与 JDK 兼容性实测、Axis 官方 WSDL 1.1 示例经官方转换器接入 Woden 的完整链路,以及 Maven 集成常见坑。

Apache WodenApache Woden2026/10/15

Apache Woden 1.0M10 快速入门与集成示例

目标:10 分钟跑通 Apache Woden 1.0M10 对 WSDL 2.0 文档的解析与组件遍历,并实测覆盖依赖事实、JDK 8/17 双版本兼容、WSDL 1.1 输入的真实报错与官方转换器接入三条主线;本文全部代码与回显均实测通过(实测日期 2026-10-15)。

Apache Woden 是 Apache Web Services 项目下的 WSDL 校验解析库。它暴露给应用的编程面很小:WSDLFactory 创建读取器、WSDLReader.readWSDL() 得到组件模型 Description、再从 Description 向下遍历 Interface/Binding/Service/Endpoint。本文以 Ubuntu 22.04 + JDK 17 + Maven 3.6.3 为实测环境,从零搭建工程并演示最有代表性的集成场景。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • JDK:OpenJDK 17.0.20.1(apt 包 openjdk-17-jdk);另备 OpenJDK 1.8.0_504 做跨版本兼容实测
  • 构建工具:Apache Maven 3.6.3
  • 组件版本:Apache Woden 1.0M10(坐标 org.apache.woden:woden-core:1.0M10)
  • 传递依赖:org.apache.ws.xmlschema:xmlschema-core:2.2.1、commons-logging:commons-logging:1.1.1
  • 工作目录:/root/woden-demo(Maven 工程)、/root/wsdl(WSDL 文件)

环境自检回显(实测):

java -version && mvn -v | head -4
openjdk version "17.0.20.1" 2026-08-18
OpenJDK Runtime Environment (build 17.0.20.1+1-1-22.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 17.0.20.1+1-1-22.04-Ubuntu, mixed mode, sharing)
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 17.0.20.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-17-openjdk-amd64

工程 pom.xml 中与 Woden 相关的部分(完整骨架见《Ubuntu 22.04 安装 Apache Woden 指南》第四章):

<dependencies>
  <dependency>
    <groupId>org.apache.woden</groupId>
    <artifactId>woden-core</artifactId>
    <version>1.0M10</version>
  </dependency>
</dependencies>

二、10 分钟最小可用:解析并遍历一个 WSDL 2.0 文档

本节用一个手写的最小 WSDL 2.0 文件演示 Woden 的完整调用闭环:建文件 → 写代码 → 编译 → 运行 → 核对输出。

2.1 准备 WSDL 2.0 文件

WSDL 2.0 的根元素是 <description>,文档包含 Interface(抽象接口)、Binding(协议绑定)、Service/Endpoint(服务与地址)四层。文件路径 /root/wsdl/StockQuote.wsdl(完整内容):

<?xml version="1.0" encoding="utf-8" ?>
<description xmlns="http://www.w3.org/ns/wsdl"
             targetNamespace="http://example.org/wsdl20/stockquote"
             xmlns:tns="http://example.org/wsdl20/stockquote"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             xmlns:wsoap="http://www.w3.org/ns/wsdl/soap">
  <types>
    <xsd:schema targetNamespace="http://example.org/wsdl20/stockquote">
      <xsd:element name="GetQuoteRequest">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="symbol" type="xsd:string"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element name="GetQuoteResponse">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="price" type="xsd:double"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
  </types>
  <interface name="StockQuoteInterface">
    <operation name="GetQuote" pattern="http://www.w3.org/ns/wsdl/in-out">
      <input element="tns:GetQuoteRequest"/>
      <output element="tns:GetQuoteResponse"/>
    </operation>
  </interface>
  <binding name="StockQuoteSOAPBinding" interface="tns:StockQuoteInterface"
           type="http://www.w3.org/ns/wsdl/soap"
           wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/">
    <operation ref="tns:GetQuote"/>
  </binding>
  <service name="StockQuoteService" interface="tns:StockQuoteInterface">
    <endpoint name="StockQuoteEndpoint" binding="tns:StockQuoteSOAPBinding"
              address="http://example.org:8080/stockquote"/>
  </service>
</description>

2.2 编写解析程序

最小调用只有三步:WSDLFactory.newInstance() 拿工厂 → newWSDLReader() 建读取器 → readWSDL() 得到 Description 组件模型。下面补充组件遍历与错误收集,构成可直接复用的骨架(文件路径 /root/woden-demo/src/main/java/WsdlParse.java):

import org.apache.woden.ErrorHandler;
import org.apache.woden.ErrorInfo;
import org.apache.woden.WSDLFactory;
import org.apache.woden.WSDLReader;
import org.apache.woden.wsdl20.Binding;
import org.apache.woden.wsdl20.Description;
import org.apache.woden.wsdl20.Endpoint;
import org.apache.woden.wsdl20.Interface;
import org.apache.woden.wsdl20.InterfaceOperation;
import org.apache.woden.wsdl20.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 最小解析程序:读入一个 WSDL 2.0 文件,遍历 Description -> Interface/Binding -> Service -> Endpoint。
 * 自定义 ErrorHandler 收集解析期错误,最后统一打印。
 */
public class WsdlParse {

    static final List<String> ERRS = new ArrayList<String>();

    public static void main(String[] args) throws Exception {
        String path = args[0];
        WSDLFactory factory = WSDLFactory.newInstance();
        System.out.println("工厂实现   : " + factory.getClass().getName());

        WSDLReader reader = factory.newWSDLReader();
        System.out.println("读取器实现 : " + reader.getClass().getName());
        System.out.println("校验开关   : FEATURE_VALIDATION=" + reader.getFeature(WSDLReader.FEATURE_VALIDATION));

        // 收集解析期错误而不是直接抛异常中断(错误处理器挂在 ErrorReporter 上)
        reader.getErrorReporter().setErrorHandler(new ErrorHandler() {
            public void warning(ErrorInfo e) { ERRS.add("[WARN ] " + e.getMessage()); }
            public void error(ErrorInfo e) { ERRS.add("[ERROR] " + e.getMessage()); }
            public void fatalError(ErrorInfo e) { ERRS.add("[FATAL] " + e.getMessage()); }
        });

        Description desc = reader.readWSDL(path);
        System.out.println("目标命名空间: " + desc.toElement().getTargetNamespace());
        System.out.println("错误条数   : " + ERRS.size());
        for (String e : ERRS) {
            System.out.println("  " + e);
        }

        Interface[] ifs = desc.getInterfaces();
        System.out.println("Interface 数: " + ifs.length);
        for (Interface i : ifs) {
            System.out.println("  Interface: " + i.getName());
            for (InterfaceOperation op : i.getInterfaceOperations()) {
                System.out.println("    Operation: " + op.getName() + " mep=" + op.getMessageExchangePattern());
            }
        }

        Binding[] bindings = desc.getBindings();
        System.out.println("Binding  数: " + bindings.length);
        for (Binding b : bindings) {
            System.out.println("  Binding: " + b.getName() + " type=" + b.getType());
        }

        Service[] services = desc.getServices();
        System.out.println("Service  数: " + services.length);
        for (Service s : services) {
            System.out.println("  Service: " + s.getName() + " implements=" + s.getInterface().getName());
            for (Endpoint ep : s.getEndpoints()) {
                System.out.println("    Endpoint: " + ep.getName() + " address=" + ep.getAddress()
                        + " binding=" + ep.getBinding().getName());
            }
        }
        System.out.println("PARSE_OK");
    }
}

两个容易写错的 API 细节(实测踩过):

  • 错误处理器不挂在 WSDLReader 上,而是挂在 reader.getErrorReporter() 上;WSDLReader 没有 setErrorHandler 方法。
  • 操作的 MEP 取值方法是 getMessageExchangePattern(),不是 getPattern()。

2.3 编译运行与结果核对

cd /root/woden-demo && mvn -q -B compile && echo EXIT=$?
EXIT=0
java -Dfile.encoding=UTF-8 -cp target/classes:$(cat /root/cp.txt) WsdlParse /root/wsdl/StockQuote.wsdl
工厂实现   : org.apache.woden.internal.DOMWSDLFactory
读取器实现 : org.apache.woden.internal.DOMWSDLReader
校验开关   : FEATURE_VALIDATION=false
目标命名空间: http://example.org/wsdl20/stockquote
错误条数   : 0
Interface 数: 1
  Interface: {http://example.org/wsdl20/stockquote}StockQuoteInterface
    Operation: {http://example.org/wsdl20/stockquote}GetQuote mep=http://www.w3.org/ns/wsdl/in-out
Binding  数: 1
  Binding: {http://example.org/wsdl20/stockquote}StockQuoteSOAPBinding type=http://www.w3.org/ns/wsdl/soap
Service  数: 1
  Service: {http://example.org/wsdl20/stockquote}StockQuoteService implements={http://example.org/wsdl20/stockquote}StockQuoteInterface
    Endpoint: StockQuoteEndpoint address=http://example.org:8080/stockquote binding={http://example.org/wsdl20/stockquote}StockQuoteSOAPBinding
PARSE_OK

验证点逐条核对:

验证点预期(实测值)
工厂落地实现org.apache.woden.internal.DOMWSDLFactory(1.0M10 仅 DOM 实现)
默认校验开关FEATURE_VALIDATION=false(语义校验需显式打开)
组件名格式全部带 {目标命名空间} 前缀(WSDL 2.0 组件模型约定)
MEPin-out(与 pattern 属性一致)
收尾标记PARSE_OK 且错误条数为 0

💡 技术拓展:组件名带花括号是因为 WSDL 2.0 的组件模型用「namespace local-name」二元组标识组件(类比 XML 的 QName 展开),打印时统一呈现为 {ns}name。mep=http://www.w3.org/ns/wsdl/in-out 是 WSDL 2.0 的 8 种标准 MEP(消息交换模式)之一,常见的还有 in-only、robust-in-only、out-in 等,完整清单见 W3C 规范附录。本文采用 WSDL 2.0 + Woden 组件模型 API。

三、版本与依赖事实(以 Maven Central 实测为准)

本节把「Woden 该用哪个坐标、依赖多干净」一次讲清,全部数据实测于 2026-10-15。

3.1 版本谱系

Maven Central 元数据实时查询回显:

curl -s https://repo1.maven.org/maven2/org/apache/woden/woden-core/maven-metadata.xml
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <groupId>org.apache.woden</groupId>
  <artifactId>woden-core</artifactId>
  <versioning>
    <latest>1.0M10</latest>
    <release>1.0M10</release>
    <versions>
      <version>1.0M10</version>
    </versions>
    <lastUpdated>20150912093442</lastUpdated>
  </versioning>
</metadata>
坐标版本发布时间说明
org.apache.woden:woden-core1.0M102015-09(Maven lastUpdated=20150912;官方 RELEASE-NOTE 落款 Sept 06, 2015)单 jar 合并实现,本文实测版本
org.apache.woden:woden1.0M102015-09仅聚合 POM(packaging=pom),不含 jar,勿直接依赖
woden-api + woden-impl-commons + woden-impl-dom1.0M92011-02三 jar 拆分 + XmlSchema 1.x,老 Axis2 栈用,实测见第六章
woden-impl-om1.0M92011-02Axiom 实现,1.0M10 起已移除

低频维护如实披露:Woden 最后一次发布是 2015 年的 1.0M10,此后 Maven Central 再无新版本;仓库里 woden-core 只有这一个版本。项目没有进入 Apache Attic(官网仍在),但活跃度极低。它仍值得使用的场景是消费既有 WSDL 2.0 资产或对接老 Axis2 生态;如果只是想要 WSDL 1.1 解析,wsdl4j(2014 年后亦无更新)或 Axis2 自带的代码生成器更常见。

3.2 依赖树与产物清单

实测依赖树(只有 2 个传递依赖,不会拖入其他框架):

mvn -B dependency:tree | grep -E "woden|xmlschema|logging"
[INFO] \- org.apache.woden:woden-core:jar:1.0M10:compile
[INFO]    +- org.apache.ws.xmlschema:xmlschema-core:jar:2.2.1:compile
[INFO]    \- commons-logging:commons-logging:jar:1.1.1:compile

jar 规模实测(ls -l):

jar大小(字节)
woden-core-1.0M10.jar374014(实测 271 个类)
xmlschema-core-2.2.1.jar171989
commons-logging-1.1.1.jar60686

woden-core 的字节码基线实测(javap -v):

minor version: 0
major version: 49

即 Java 5(major 49),与官方 RELEASE-NOTE 的「Woden now requires Java 5」一致——运行期的 JDK 兼容下限很低,JDK 8 与 17 都能跑它。

四、JDK 8 / JDK 17 双版本兼容实测

Woden 库本身是 Java 5 字节码,但「能在 JDK 17 上构建、在 JDK 8 上运行」的组合值得实测确认,这是老库集成的常见疑虑。

第一步:把示例工程按 Java 8 语义重编译(在 JDK 17 的 Maven 上指定 --release 8):

cd /root/woden-demo && mvn -q -B clean compile -Dmaven.compiler.release=8
javap -v -cp target/classes WsdlParse | grep major
major version: 52

第二步:在 OpenJDK 1.8.0_504 环境上,用 woden-core 1.0M10 运行同一个程序(classpath 使用官方 bin 包解出的 3 个 jar):

java -version | head -1
java -Dfile.encoding=UTF-8 -cp out:lib/woden-core-1.0M10.jar:lib/xmlschema-core-2.2.1.jar:lib/commons-logging-1.1.1.jar WsdlParse /root/wsdl/StockQuote.wsdl
openjdk 1.8.0_504
工厂实现   : org.apache.woden.internal.DOMWSDLFactory
读取器实现 : org.apache.woden.internal.DOMWSDLReader
校验开关   : FEATURE_VALIDATION=false
目标命名空间: http://example.org/wsdl20/stockquote
错误条数   : 0
(中间组件遍历与 2.3 节一致)
PARSE_OK

结论(实测):同一份业务代码 + woden-core 1.0M10,从 JDK 8 到 JDK 17 全兼容。反过来(Java 17 语义编译的程序放到 1.8 运行)会报 UnsupportedClassVersionError: ... class file version 61.0 ... up to 52.0,这是 JDK 版本错配而非 Woden 问题。

五、真实输入实战:Axis 官方示例 WSDL 的接入

公司现有资产大多是 WSDL 1.1(Axis 1.x/Axis2 时代的产物),而 Woden 只吃 WSDL 2.0。本节用 Axis2 官方示例 Version.wsdl 完整实测「直读报错 → 官方转换器转换 → 解析成功」的接入链路。

5.1 获取 Axis 官方示例 WSDL

Axis2 官方源码仓库自带示例 Version.wsdl(版本查询服务,Axis2 部署后默认自带的服务之一):

mkdir -p /root/axis && cd /root/axis
curl -s --max-time 60 -o Version.wsdl 'https://raw.githubusercontent.com/apache/axis-axis2-java-core/master/modules/codegen/test-resources/wsdls/Version.wsdl'
wc -l Version.wsdl
108 Version.wsdl

确认它是 WSDL 1.1(根元素为 wsdl:definitions,而非 description):

grep -oE 'wsdl:definitions' Version.wsdl | head -1
wsdl:definitions

5.2 直读 WSDL 1.1:拿真实报错

把 WSDL 1.1 文档直接喂给 Woden:

java -Dfile.encoding=UTF-8 -cp target/classes:$(cat /root/cp.txt) WsdlParse /root/axis/Version.wsdl
Exception in thread "main" WSDLException: faultCode=INVALID_WSDL: Fatal WSDL error:
0:0,WSDL514,It appears as though you are trying to parse a WSDL 1.1 document but Woden is a WSDL 2.0 parser. Please check the namespace of the document's document element, or try another tool such as the Woden tool to convert from WSDL 1.1 to WSDL 2.0.
	at org.apache.woden.internal.DOMWSDLReader.parseDocument(DOMWSDLReader.java:838)
	(输出节选:中间同类内部帧已折叠,首尾帧完整)
	at org.apache.woden.internal.DOMWSDLReader.readWSDL(DOMWSDLReader.java:298)
	at org.apache.woden.internal.DOMWSDLReader.readWSDL(DOMWSDLReader.java:157)
	at WsdlParse.main(WsdlParse.java:39)

实测结论:错误码 WSDL514 明确指认「这是 WSDL 1.1 文档,Woden 是 WSDL 2.0 解析器」,并给出官方建议——用 Woden 自带的转换工具。报错是 faultCode=INVALID_WSDL 的 WSDLException,属于致命错误,读取过程立即中止。

5.3 官方转换器:WSDL 1.1 转 WSDL 2.0

Woden 发行包自带 woden-tool-1.0M10.jar,其入口类 org.apache.woden.tool.converter.Convert 就是官方的 WSDL 1.1→2.0 转换器(内部用 wsdl4j 读 1.1、用 Woden 写 2.0)。从官方 bin 包取 woden-tool-1.0M10.jar、woden-core-1.0M10.jar、xmlschema-core-2.2.1.jar、wsdl4j-1.6.2.jar、commons-logging-1.1.1.jar 五个 jar(bin 包下载与校验见安装指南),执行转换:

java -cp woden-tool-1.0M10.jar:woden-core-1.0M10.jar:xmlschema-core-2.2.1.jar:wsdl4j-1.6.2.jar:commons-logging-1.1.1.jar \
  org.apache.woden.tool.converter.Convert -wsdl Version.wsdl -dir out -overwrite on
Retrieving document at 'Version.wsdl'.
Oct 15, 2026 12:01:12 PM org.apache.woden.tool.converter.Utils getOutputStream
INFO: Created directory '/root/axis/out'.
Oct 15, 2026 12:01:12 PM org.apache.woden.tool.converter.Utils getOutputStream
INFO: Created file '/root/axis/out/Version.wsdl2'.
Oct 15, 2026 12:01:12 PM org.apache.woden.tool.converter.Convert main
INFO: Done.
Elapsed time: 113ms

转换产物实测清单与内容要点(ls out/ 与文件首尾):

-rw-r--r-- 1 root root 2959 Oct 15 11:20 out/Version.wsdl2
<description xmlns="http://www.w3.org/ns/wsdl"
             targetNamespace="http://axisversion.sample/xsd"
             ...>
  <types>
    <xs:schema attributeFormDefault="qualified" elementFormDefault="unqualified" targetNamespace="http://axisversion.sample/xsd" ...>
      <xs:element name="ExceptionFault" ...>
  ...
  <service name="Version" interface="tns:VersionPortType">
    <endpoint name="VersionSOAP11port_http" binding="tns:VersionSOAP11Binding"
              address="http://127.0.0.1:8000/axis2/services/Version">
  </service>
</description>

可以看到:根元素已变成 WSDL 2.0 的 <description>,wsdl:portType 转成了 interface,端口类型 VersionPortType 与服务端点 VersionSOAP11port_http 一一对应。

5.4 解析转换产物:全链路打通

java -Dfile.encoding=UTF-8 -cp target/classes:$(cat /root/cp.txt) WsdlParse /root/axis/out/Version.wsdl2
工厂实现   : org.apache.woden.internal.DOMWSDLFactory
读取器实现 : org.apache.woden.internal.DOMWSDLReader
校验开关   : FEATURE_VALIDATION=false
目标命名空间: http://axisversion.sample/xsd
错误条数   : 0
Interface 数: 1
  Interface: {http://axisversion.sample/xsd}VersionPortType
    Operation: {http://axisversion.sample/xsd}getVersion mep=http://www.w3.org/ns/wsdl/in-out
    Operation: {http://axisversion.sample/xsd}foo-bar mep=http://www.w3.org/ns/wsdl/in-only
    Operation: {http://axisversion.sample/xsd}Foo-ba.r2 mep=http://www.w3.org/ns/wsdl/in-only
Binding  数: 1
  Binding: {http://axisversion.sample/xsd}VersionSOAP11Binding type=http://www.w3.org/ns/wsdl/soap
Service  数: 1
  Service: {http://axisversion.sample/xsd}Version implements={http://axisversion.sample/xsd}VersionPortType
    Endpoint: VersionSOAP11port_http address=http://127.0.0.1:8000/axis2/services/Version binding={http://axisversion.sample/xsd}VersionSOAP11Binding
PARSE_OK

实测结论:Axis 官方 WSDL 1.1 示例经官方转换器一步转入 Woden 生态,服务 Version、接口 VersionPortType、3 个操作(含 in-out 与 in-only 两种 MEP)、SOAP 1.1 绑定与端点地址全部正确落进组件模型。集成老 WSDL 资产的标准姿势就是这条链路。

六、1.0M9 老组合(woden-api + woden-impl-dom)共存实测

如果代码库受限于 XmlSchema 1.x(org.apache.ws.commons.schema:XmlSchema),就得用 2011 年的 1.0M9 三 jar 组合。它的 API 包名与 1.0M10 完全一致(org.apache.woden.*),同一个 WsdlParse 无需改一行代码。

1.0M9 的依赖组合实测(手工 classpath 演示,Maven 下用 4 个依赖声明等价):

jar作用
woden-api-1.0M9.jar全部接口与 SPI
woden-impl-commons-1.0M9.jar实现公共基类
woden-impl-dom-1.0M9.jarDOM 实现(含 DOMWSDLFactory 等)
XmlSchema-1.4.7.jar(org.apache.ws.commons.schema)1.0M9 声明的旧版 XmlSchema

跳过 woden-impl-commons 会直接失败,实测回显:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/woden/internal/BaseWSDLFactory

补齐后用同一程序、同一 WSDL 运行(实测回显节选):

工厂实现   : org.apache.woden.internal.DOMWSDLFactory
读取器实现 : org.apache.woden.internal.DOMWSDLReader
校验开关   : FEATURE_VALIDATION=false
目标命名空间: http://example.org/wsdl20/stockquote
错误条数   : 0
Interface 数: 1
(组件遍历回显与 2.3 节一致)
PARSE_OK

实测结论:两条版本线的 API 源码级兼容,业务代码可以零改动升级/降级。但新项目一律建议直接用 1.0M10 单 jar(少 2 个依赖、去掉 Axiom 历史包袱)。

七、Maven 集成常见坑(实测汇总)

  1. 不要用 org.apache.woden:woden 坐标。实测该坐标是聚合 POM(packaging=pom),依赖它不会引入任何 Woden 类,编译期就会 找不到符号 WSDLFactory。正确坐标:org.apache.woden:woden-core:1.0M10。
  2. Maven 3.6.3 默认 compiler 插件不认识 maven.compiler.release。默认绑定 3.1 会退回 source/target=1.5 并被 JDK 17 拒绝(Source option 5 is no longer supported. Use 7 or later.),pom 里显式固定 maven-compiler-plugin 3.11.0(CentOS 8 的 Maven 3.5.4 下实测同样编译通过)。
  3. 1.0M9 三 jar 组合缺一不可。woden-impl-dom 依赖 woden-impl-commons,漏掉后者报 NoClassDefFoundError: org/apache/woden/internal/BaseWSDLFactory(第六章实测);Maven 下声明依赖即可,手工 classpath 最容易踩。
  4. 不要给 1.0M10 的 WSDLReader 设 FEATURE_CONTINUE_ON_ERROR/FEATURE_VERBOSE。这两个常量虽在接口上声明,但实现只认 FEATURE_VALIDATION,其余传入报 IllegalArgumentException: The feature name ... is not recognized.。
  5. 中文源码与输出:pom 设 project.build.sourceEncoding=UTF-8,java 命令带 -Dfile.encoding=UTF-8,两者缺一都会乱码。
  6. WSDL 输入的根元素必须是 description。拿到 WSDLException faultCode=INVALID_WSDL ... WSDL514 时先看根元素命名空间——大概率喂的是 WSDL 1.1,走第五章转换链路。

八、参考链接

  1. Apache Woden 官方主页:http://ws.apache.org/woden/
  2. Woden 1.0M10 官方发布说明(bin 包内 RELEASE-NOTE):https://archive.apache.org/dist/ws/woden/1.0M10/
  3. Maven 中央仓库 woden-core:https://repo1.maven.org/maven2/org/apache/woden/woden-core/
  4. Maven 中央仓库 woden-api(1.0M9 旧线):https://repo1.maven.org/maven2/org/apache/woden/woden-api/
  5. Axis2 官方示例 WSDL(本文 Version.wsdl 来源):https://github.com/apache/axis-axis2-java-core
  6. W3C WSDL 2.0 规范:https://www.w3.org/TR/wsdl20/
  7. W3C WSDL 2.0 规范入门(Primer):https://www.w3.org/TR/wsdl20-primer/