Ubuntu 22.04 安装 Apache Woden 指南

在 Ubuntu 22.04 上从零安装 Apache Woden 1.0M10(woden-core),覆盖 JDK 17 与 Maven 环境、Maven 坐标与官方 bin 包两种方案、jar 直跑最小验证、多版本管理与卸载,命令回显均实测通过。

Apache WodenApache Woden2026/10/15

Ubuntu 22.04 安装 Apache Woden 指南

目标:在 Ubuntu 22.04 上从零搭建 Apache Woden 1.0M10 的开发与运行环境(JDK 17 + Maven 3.6.3 + 官方依赖),并跑通 WSDL 2.0 的解析与组件遍历最小验证;本文全部命令与回显均已在 Ubuntu 22.04 实测通过(实测日期 2026-10-15)。

Apache Woden 是 Apache Web Services 项目下的 WSDL 校验解析库(官方 README 原话:"Woden is a Web Service Description Language (WSDL) validating parser. Currently Woden supports WSDL 2.0."),用于读取、校验、遍历和回写 WSDL 2.0 文档。它是纯 Java 库,没有独立进程与常驻服务,安装的本质就是「装好 JDK/构建工具 → 引入依赖 → 写最小验证代码 → 编译运行」。本文给出两种落地方式:面向开发的 Maven 依赖方案,以及面向无构建体系场景的官方 bin 包 + jar 直跑方案。

一、环境信息

本节先固定可复现的基线环境,后续所有命令均在此环境执行。

  • 操作系统:Ubuntu 22.04.5 LTS(PRETTY_NAME="Ubuntu 22.04.5 LTS")
  • 架构:x86_64
  • JDK:OpenJDK 17.0.20.1(apt 包 openjdk-17-jdk)
  • 构建工具:Apache Maven 3.6.3
  • 组件版本:Apache Woden 1.0M10(org.apache.woden:woden-core:1.0M10)
  • 传递依赖:xmlschema-core 2.2.1、commons-logging 1.1.1(共 2 个,实测依赖树)
  • 官方 bin 包地址:https://archive.apache.org/dist/ws/woden/1.0M10/woden-1.0M10-bin.zip
  • Maven 坐标:org.apache.woden:woden-core:1.0M10
  • 验证用工作目录:/root/woden-demo(工程)、/root/jar-run(jar 直跑)

系统与架构确认(实时回显):

cat /etc/os-release | head -2
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
uname -m
x86_64

💡 说明:Woden 是库而非服务,环境中不存在需要常驻的守护进程;「安装完成」的判定标准是可编译并运行一个调用其 API 解析 WSDL 2.0 的最小程序,而不是某个端口处于监听状态。

二、前置条件

本节说明安装前必须满足的条件。Ubuntu 22.04 自带可用的软件源,联网即可通过 apt 获取 JDK 与 Maven。

  1. 具有 root 或 sudo 权限的 Ubuntu 22.04 系统。
  2. 可访问 Ubuntu 官方软件源(apt update 能正常拉取索引)。
  3. 可访问 Apache 归档下载站 archive.apache.org 与 Maven 中央仓库 repo1.maven.org(本文实测网络直连可达)。
  4. 至少 2 GB 可用磁盘空间(JDK + Maven + 依赖合计约 500 MB)。

两个下载源的连通性确认(实时回显):

curl -sI --max-time 20 https://archive.apache.org/dist/ws/woden/1.0M10/ | head -3
HTTP/1.1 200 OK
Date: Thu, 15 Oct 2026 11:53:09 GMT
Server: Apache
curl -sI --max-time 20 https://repo1.maven.org/maven2/org/apache/woden/woden-core/1.0M10/woden-core-1.0M10.jar | head -3
HTTP/2 200
date: Thu, 15 Oct 2026 11:53:11 GMT
content-type: application/java-archive

三、版本选型说明

本节给出 Woden 的版本谱系与坐标拆分史,帮助读者选对版本。数据均来自 Maven Central 元数据实时查询(2026-10-15)。

curl -s --max-time 30 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(lastUpdated=20150912)单 jar 含 API + DOM 实现所有新项目默认选择
org.apache.woden:woden1.0M102015-09仅聚合 POM(packaging=pom),无 jar早期文档遗留写法,勿直接依赖
woden-api + woden-impl-dom + woden-impl-commons1.0M92011-02(lastUpdated=20110214)三 jar 拆分 + XmlSchema 1.x老 Axis2 栈兼容
woden-impl-om1.0M92011-02Axiom(OM)实现仅需 AXIOM 时

关键事实(引自官方 bin 包内 RELEASE-NOTE 原文,实测读取):

*   Support for the Axiom API has been removed. Starting with the 1.0M10
    release, Woden only provides an implementation that uses the DOM API.
    As a consequence, the `woden-api`, `woden-common` and `woden-dom`
    modules have been replaced by a single module called `woden-core`.

*   Woden now requires Java 5.

*   Woden has been upgraded to use [XmlSchema 2].

即:1.0M10(2015-09-06 发布)把旧的 woden-api/woden-common/woden-dom 三模块合并为单一 woden-core,移除 Axiom 实现,只保留 DOM 实现,字节码基线为 Java 5(实测 woden-core-1.0M10.jar 主版本号为 49,即 Java 5)。本文实际采用 1.0M10,理由:它是 Maven Central 上 woden-core 的唯一且最新版本,单 jar 即可用,且实测在 JDK 8 与 JDK 17 上均可运行。

💡 技术拓展:WSDL 1.1 与 WSDL 2.0 是两个不同的规范——WSDL 1.1(2001 年 W3C Note,<definitions> 根元素)是事实标准但从未成为正式推荐标准;WSDL 2.0(2007 年 W3C Recommendation,<description> 根元素)重构了组件模型并引入 MEP(消息交换模式)。Woden 只支持 WSDL 2.0:实测把 WSDL 1.1 文档喂给 Woden 会得到致命错误 WSDL514,It appears as though you are trying to parse a WSDL 1.1 document but Woden is a WSDL 2.0 parser.(复现见第 3 篇《Apache Woden 1.0M10 快速入门与集成示例》)。若要解析 WSDL 1.1,Java 生态的常用替代是 wsdl4j(WSDL4J/JSR-110,javax.wsdl API)——Woden 官方 bin 包里恰好带了 wsdl4j-1.6.2.jar,供其配套的 WSDL 1.1→2.0 转换工具使用。本文采用 Woden + WSDL 2.0。

四、方案 A:Maven 依赖安装(在线,推荐)

本节面向常规 Java 项目开发,通过 apt 安装 JDK 与 Maven,再用 Maven 坐标引入 woden-core 依赖并跑通最小验证程序。

4.1 方案说明

方案 A 的链路是:apt 安装 openjdk-17-jdk 与 maven → 在 pom.xml 中声明 org.apache.woden:woden-core:1.0M10 → Maven 自动下载 jar 与 2 个传递依赖到本地仓库 → 编译并运行验证程序。优点是版本由 pom 统一管控、依赖自动解析;缺点是首次构建需要联网。

4.2 安装 JDK 17

Ubuntu 22.04 官方源内置 openjdk-17-jdk,直接安装即可:

apt-get update -qq && apt-get install -y openjdk-17-jdk
# 输出节选(实测首尾)
Setting up openjdk-17-jdk:amd64 (17.0.20.1+1-1~22.04) ...
Processing triggers for libc-bin (2.35-0ubuntu3.15) ...

安装后确认版本:

java -version
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)

验证点:java -version 能输出 17.0.x 即表示 JDK 就绪。Woden 1.0M10 字节码基线为 Java 5(major 49),JDK 8 及以上均可运行,选 17 是为了获得现代构建工具链。

4.3 安装 Maven

apt-get install -y maven
# 输出节选(实测首尾)
Setting up maven (3.6.3-5) ...
update-alternatives: using /usr/share/maven/bin/mvn to provide /usr/bin/mvn (mvn) in auto mode

确认版本与 Maven 实际使用的 JDK:

mvn -v
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

验证点:Java version 一行显示 17.0.20.1,说明 Maven 已绑定到 JDK 17,无需额外设置 JAVA_HOME。

4.4 创建工程并引入依赖

建立最小 Maven 工程,pom.xml 中只声明 woden-core 一个依赖(其传递依赖 xmlschema-core 与 commons-logging 由 Maven 自动解析):

mkdir -p /root/woden-demo/src/main/java

pom.xml(完整内容,文件路径 /root/woden-demo/pom.xml):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>demo</groupId>
  <artifactId>woden-demo</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.release>17</maven.compiler.release>
  </properties>

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

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.11.0</version>
      </plugin>
    </plugins>
  </build>
</project>

逐项说明关键配置:

  • org.apache.woden:woden-core:1.0M10:唯一运行期依赖。Maven 会下载 woden-core-1.0M10.jar(374014 字节)及传递依赖 xmlschema-core-2.2.1.jar(171989 字节)与 commons-logging-1.1.1.jar(60686 字节),实测依赖树见 4.6 节。
  • maven.compiler.release=17:按 JDK 17 语义编译;若目标机器是 JDK 8,可改为 8(woden-core 自身是 Java 5 字节码,两者互不影响)。
  • maven-compiler-plugin 显式固定 3.11.0:Maven 3.6.3 默认绑定的 compiler 插件是 3.1,不认识 maven.compiler.release 属性,会退回 source/target=1.5 并被 JDK 17 拒绝(报 Source option 5 is no longer supported)。
  • project.build.sourceEncoding=UTF-8:源码含中文注释/字符串时防止按 POSIX 默认编码编译报 unmappable character。

4.5 最小验证代码与 WSDL 文件

先准备一个手写的最小 WSDL 2.0 文件(文件路径 /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>

验证程序 WsdlParse.java(文件路径 /root/woden-demo/src/main/java/WsdlParse.java)用 Woden 的工厂与读取器解析该文件,并遍历 Interface、Binding、Service、Endpoint 四类组件:

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");
    }
}

4.6 编译与运行验证

编译并确认依赖树:

cd /root/woden-demo && mvn -q -B compile
echo "EXIT=$?"
EXIT=0
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

解读:依赖树只有 3 个节点——woden-core 与它的 2 个传递依赖,没有任何其他 jar,不会产生版本冲突。

运行验证程序:

java -Dfile.encoding=UTF-8 -cp target/classes:$(cat /root/cp.txt) WsdlParse /root/wsdl/StockQuote.wsdl

其中 classpath 依赖清单可用如下命令生成到 /root/cp.txt:

mvn -q -B dependency:build-classpath -Dmdep.outputFile=/root/cp.txt

完整运行回显(实测):

工厂实现   : 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

结果解读:工厂与读取器分别落地为 DOMWSDLFactory / DOMWSDLReader(1.0M10 只有 DOM 实现);默认 FEATURE_VALIDATION=false;Interface、Binding、Service、Endpoint 四类组件全部按声明解析出来,MEP 为 in-out,SOAP 绑定协议为 SOAP 1.2 HTTP。出现 PARSE_OK 表示 Woden 1.0M10 已在 JDK 17 上完整可用。

💡 说明:-Dfile.encoding=UTF-8 用于 POSIX/C locale 下中文输出不乱码;若系统 LANG 已为 C.UTF-8 可省略。

五、方案 B:官方 bin 包 + jar 直跑(离线友好)

本节面向没有 Maven/构建体系的场景,直接使用 Apache 归档站的官方 bin 包,用 javac + java 完成编译运行。

5.1 方案说明

链路是:从 archive.apache.org 下载 woden-1.0M10-bin.zip → 校验 sha1 → 解压得到 6 个 jar → 用 javac -cp 编译源码 → 用 java -cp 运行。适用于离线环境、脚本化部署或纯粹想「拿到 jar 就能用」的读者。

5.2 下载与完整性校验

mkdir -p /root/jar-run && cd /root/jar-run
curl -s --max-time 120 -o woden-1.0M10-bin.zip https://archive.apache.org/dist/ws/woden/1.0M10/woden-1.0M10-bin.zip
curl -s --max-time 30 -o woden-1.0M10-bin.zip.sha1 https://archive.apache.org/dist/ws/woden/1.0M10/woden-1.0M10-bin.zip.sha1
ls -l woden-1.0M10-bin.zip
-rw-r--r-- 1 root root 1798953 Oct 15 11:37 woden-1.0M10-bin.zip

校验 sha1(期望值与实测值必须逐字一致):

echo "期望: $(cat woden-1.0M10-bin.zip.sha1)"
echo "实测: $(sha1sum woden-1.0M10-bin.zip | awk '{print $1}')"
期望: 310b8427dea4cfb9eb293229ad3489e2e3156e46
实测: 310b8427dea4cfb9eb293229ad3489e2e3156e46

⚠️ 注意:若 sha1 不一致,说明下载包损坏或被篡改,须删除后重新下载;切勿跳过校验直接使用。

5.3 解压与包内结构

cd /root/jar-run && jar xf woden-1.0M10-bin.zip && ls
LICENSE
NOTICE
README
RELEASE-NOTE
docs
lib
woden-1.0M10-bin.zip
woden-1.0M10-bin.zip.sha1

注意:该 zip 没有顶层版本目录,直接展开为 lib/(jar)、docs/(Javadoc)、LICENSE、NOTICE、README、RELEASE-NOTE。lib/ 内 6 个 jar 实测清单:

ls -l lib/*.jar | awk '{print $5, $9}'
60686 lib/commons-logging-1.1.1.jar
56825 lib/woden-ant-1.0M10.jar
374014 lib/woden-core-1.0M10.jar
39680 lib/woden-tool-1.0M10.jar
148429 lib/wsdl4j-1.6.2.jar
171989 lib/xmlschema-core-2.2.1.jar

其中 woden-core-1.0M10.jar(含 271 个类)是解析库本体;woden-tool-1.0M10.jar 是 WSDL 1.1→2.0 转换工具(配合 wsdl4j-1.6.2.jar);woden-ant-1.0M10.jar 提供 Ant 任务;docs/apidocs/ 是离线 Javadoc。

5.4 javac 编译与 java 运行

用官方 jar 作为编译与运行期 classpath(解析库运行只需 3 个 jar:woden-core、xmlschema-core、commons-logging):

cd /root/jar-run
cp /root/woden-demo/src/main/java/WsdlParse.java .
cp /root/wsdl/StockQuote.wsdl .
javac -encoding UTF-8 -cp lib/woden-core-1.0M10.jar:lib/xmlschema-core-2.2.1.jar:lib/commons-logging-1.1.1.jar -d out WsdlParse.java
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 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

验证点:javac 与 java -cp 全程无 NoClassDefFoundError,说明 3 个 jar 的最小 classpath 成立;官方 bin 包与 Maven 仓库是同一份构件。

5.5 Maven 中央仓库单 jar 的独立获取(可选)

若只想从 Maven 中央仓库获取单个 jar,可直接下载并校验 sha1:

cd /root/jar-run && curl -sO --max-time 60 https://repo1.maven.org/maven2/org/apache/woden/woden-core/1.0M10/woden-core-1.0M10.jar
curl -sO --max-time 30 https://repo1.maven.org/maven2/org/apache/woden/woden-core/1.0M10/woden-core-1.0M10.jar.sha1
echo "期望: $(cat woden-core-1.0M10.jar.sha1)"
echo "实测: $(sha1sum woden-core-1.0M10.jar | awk '{print $1}')"
期望: ffed89bc39eb7fce6b74765b3417c6844d8003a2
实测: ffed89bc39eb7fce6b74765b3417c6844d8003a2

六、方案对比与选择建议

本节汇总两种方案的差异,给出选型建议。两种方案产出的是同一份 Woden 1.0M10 代码,差别仅在获取与装配方式。

维度方案 A:Maven 依赖方案 B:官方 bin 包 + jar 直跑
运行期依赖Maven 自动解析(2 个传递依赖)手工拼 classpath(最少 3 个 jar)
是否联网首次构建需联网仅下载时需要联网
依赖版本管控pom 统一声明,可锁版本无,靠文件命名区分
完整性校验Maven 自动校验需手工 sha1 校验
附带工具仅解析库额外带 woden-tool 转换器、woden-ant、离线 Javadoc
适用场景常规工程开发离线脚本、临时验证、无构建体系

选型建议:若项目有构建体系(Maven/Gradle),一律选方案 A;若在无构建工具的老旧服务器上临时验证,或需要离线 Javadoc 与 WSDL 1.1 转换工具,选方案 B。两者也可共存——用方案 A 开发、用方案 B 分发 jar。

七、基础配置

Woden 是库而非服务,没有独立配置文件,全部行为通过 JVM 环境变量与代码级 API 参数控制。

环境变量 JAVA_HOME(Maven 依赖它定位 JDK)。默认会话中该变量为空(实测回显):

echo "JAVA_HOME=$JAVA_HOME"
JAVA_HOME=

此时 apt 版 Maven 仍能正常工作(4.3 节 mvn -v 回显 runtime 指向 JDK 17),因为 Ubuntu 官方源的 Maven 通过 PATH 中的 java 完成 JDK 定位。若需要显式固定,可导出(实测回显):

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 && echo "JAVA_HOME=$JAVA_HOME"
JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64

代码级「参数」即 WSDLReader 的 feature 开关。实测 1.0M10 的 WSDLReader 只支持一个 feature——FEATURE_VALIDATION(默认 false,打开后启用组件模型语义校验,详见第 5 篇)。接口上虽声明了 FEATURE_VERBOSE、FEATURE_CONTINUE_ON_ERROR 两个常量,但传入 setFeature 会被拒绝,实测回显:

Exception in thread "main" java.lang.IllegalArgumentException: The feature name "http://ws.apache.org/woden/features/continue_on_error" is not recognized.

因此错误收集不要走「continue on error」开关,而是给 reader.getErrorReporter() 挂自定义 ErrorHandler(4.5 节代码已示范)。

八、验证清单

安装是否成功,逐项核对以下实测锚点:

检查项预期(实测值)不符时排查
java -versionopenjdk version "17.0.20.1"未装 JDK 或 alternatives 指向旧版本
mvn -v 的 Java version 行17.0.20.1Maven 绑定到其他 JDK,见第七章
mvn -q -B compile 退出码0报 Source option 5 → 4.4 节 compiler 插件说明
依赖树节点数3(woden-core + 2 传递依赖)出现重复 XmlSchema → 检查是否混用 1.0M9 坐标
运行首行工厂实现 : org.apache.woden.internal.DOMWSDLFactoryNoClassDefFoundError → classpath 缺 xmlschema-core 或 commons-logging
运行末行PARSE_OKWSDLException ... WSDL514 → 输入是 WSDL 1.1 文档,见 FAQ Q1

九、常见问题(FAQ)

Q1:运行报 WSDLException: faultCode=INVALID_WSDL ... WSDL514,It appears as though you are trying to parse a WSDL 1.1 document but Woden is a WSDL 2.0 parser.? 这不是安装问题,而是输入文档是 WSDL 1.1(<definitions> 根元素)。Woden 1.0M10 只解析 WSDL 2.0(<description> 根元素)。解法:改用 WSDL 2.0 文档,或先用官方转换工具 org.apache.woden.tool.converter.Convert(bin 包内 woden-tool-1.0M10.jar)把 WSDL 1.1 转成 2.0,完整实测流程见第 3 篇第五章。

Q2:运行报 UnsupportedClassVersionError: ... class file version 61.0, this version ... up to 52.0? 是自己的应用类按 JDK 17 编译(major 61)却在 JDK 8 上运行,与 Woden 无关(woden-core 是 major 49)。解法:统一编译与运行 JDK,或把应用按 -Dmaven.compiler.release=8 降级编译后即可在 JDK 8 上与 woden-core 共同运行(第 3 篇已实测)。

Q3:给 WSDLReader 设置 FEATURE_CONTINUE_ON_ERROR 或 FEATURE_VERBOSE 报 IllegalArgumentException: The feature name ... is not recognized.? 1.0M10 的读取器只实现了 FEATURE_VALIDATION 一个开关,接口上的另外两个常量是历史遗留。错误收集改用自定义 ErrorHandler 挂到 ErrorReporter(4.5 节代码),校验行为用 FEATURE_VALIDATION 控制。

Q4:mvn compile 报 unmappable character for encoding 或运行时中文乱码? 编译期乱码在 pom 加 project.build.sourceEncoding=UTF-8(4.4 节已含);运行期中文变问号在 java 命令加 -Dfile.encoding=UTF-8。

Q5:还能用 org.apache.woden:woden:1.0M10 这个坐标吗? 不建议。实测该坐标 packaging 为 pom、不含 jar,仅是聚合 POM;依赖它不会引入任何 Woden 类。正确坐标是 org.apache.woden:woden-core:1.0M10。老资料里的 woden-api/woden-impl-dom 属于 1.0M9 三 jar 时代(还需补 woden-impl-commons 与旧版 XmlSchema),新项目不要使用。

十、卸载与清理

Woden 本身不产生系统级安装,卸载即移除依赖与本地文件。

移除工程、下载产物与缓存:

rm -rf /root/woden-demo /root/jar-run /root/wsdl /root/cp.txt
rm -rf $HOME/.m2/repository/org/apache/woden
ls /root/woden-demo 2>&1
ls: cannot access '/root/woden-demo': No such file or directory

卸载 JDK 与 Maven(仅当不再需要)。先以 -s 预演确认将删除的包,无误后去掉 -s 真正执行:

apt-get -s purge -y openjdk-17-jdk maven
# 输出节选(实测首尾)
The following packages will be REMOVED:
  maven* openjdk-17-jdk*
0 upgraded, 0 newly installed, 2 to remove and 1 not upgraded.

确认无误后真正卸载:

apt-get purge -y openjdk-17-jdk maven && apt-get autoremove -y

十一、参考链接

  1. Apache Woden 官方主页:http://ws.apache.org/woden/
  2. 官方 bin 包下载目录(含 sha1/asc):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. W3C WSDL 2.0 规范:https://www.w3.org/TR/wsdl20/
  6. WSDL 2.0 规范入门(Primer):https://www.w3.org/TR/wsdl20-primer/