Ubuntu 22.04 安装 Apache Woden 指南
在 Ubuntu 22.04 上从零安装 Apache Woden 1.0M10(woden-core),覆盖 JDK 17 与 Maven 环境、Maven 坐标与官方 bin 包两种方案、jar 直跑最小验证、多版本管理与卸载,命令回显均实测通过。
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。
- 具有 root 或 sudo 权限的 Ubuntu 22.04 系统。
- 可访问 Ubuntu 官方软件源(
apt update能正常拉取索引)。 - 可访问 Apache 归档下载站
archive.apache.org与 Maven 中央仓库repo1.maven.org(本文实测网络直连可达)。 - 至少 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-core | 1.0M10 | 2015-09(lastUpdated=20150912) | 单 jar 含 API + DOM 实现 | 所有新项目默认选择 |
org.apache.woden:woden | 1.0M10 | 2015-09 | 仅聚合 POM(packaging=pom),无 jar | 早期文档遗留写法,勿直接依赖 |
woden-api + woden-impl-dom + woden-impl-commons | 1.0M9 | 2011-02(lastUpdated=20110214) | 三 jar 拆分 + XmlSchema 1.x | 老 Axis2 栈兼容 |
woden-impl-om | 1.0M9 | 2011-02 | Axiom(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.wsdlAPI)——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 -version | openjdk version "17.0.20.1" | 未装 JDK 或 alternatives 指向旧版本 |
mvn -v 的 Java version 行 | 17.0.20.1 | Maven 绑定到其他 JDK,见第七章 |
mvn -q -B compile 退出码 | 0 | 报 Source option 5 → 4.4 节 compiler 插件说明 |
| 依赖树节点数 | 3(woden-core + 2 传递依赖) | 出现重复 XmlSchema → 检查是否混用 1.0M9 坐标 |
| 运行首行 | 工厂实现 : org.apache.woden.internal.DOMWSDLFactory | NoClassDefFoundError → classpath 缺 xmlschema-core 或 commons-logging |
| 运行末行 | PARSE_OK | WSDLException ... 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
十一、参考链接
- Apache Woden 官方主页:http://ws.apache.org/woden/
- 官方 bin 包下载目录(含 sha1/asc):https://archive.apache.org/dist/ws/woden/1.0M10/
- Maven 中央仓库 woden-core 坐标:https://repo1.maven.org/maven2/org/apache/woden/woden-core/
- Maven 中央仓库 woden-api(1.0M9 旧线):https://repo1.maven.org/maven2/org/apache/woden/woden-api/
- W3C WSDL 2.0 规范:https://www.w3.org/TR/wsdl20/
- WSDL 2.0 规范入门(Primer):https://www.w3.org/TR/wsdl20-primer/