CentOS 8 安装 Apache Woden 指南

在 CentOS 8(EOL 后切换阿里云归档源)上安装 Apache Woden 1.0M10(woden-core),覆盖 el8 源修复、显式 JAVA_HOME 与 alternatives 切 JDK、Maven 坐标与官方 bin 包两种方案、jar 直跑最小验证,命令回显均实测通过。

Apache WodenApache Woden2026/10/15

CentOS 8 安装 Apache Woden 指南

目标:在 CentOS 8 上从零搭建 Apache Woden 1.0M10 的开发与运行环境(JDK 17 + Maven 3.5.4 + 官方依赖),处理 el8 EOL 软件源与多 JDK 切换两个真实障碍,并跑通 WSDL 2.0 解析最小验证;本文全部命令与回显均已在 CentOS 8 实测通过(实测日期 2026-10-15)。

Apache Woden 是 Apache Web Services 项目下的 WSDL 校验解析库,当前唯一发布的实现线是 org.apache.woden:woden-core:1.0M10(2015-09),只解析 WSDL 2.0。它是纯 Java 库,没有独立进程与常驻服务,安装的本质就是「修复软件源 → 装好 JDK/构建工具 → 引入依赖 → 写最小验证代码 → 编译运行」。CentOS 8 已于 2021-12-31 停止维护(EOL),官方源 mirror.centos.org 已下线,本文第三章先如实处理这个前置障碍,再走 Maven 依赖与官方 bin 包两条安装路线。

一、环境信息

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

  • 操作系统:CentOS Linux 8(NAME="CentOS Linux" / VERSION="8",x86_64)
  • 系统缺省 JDK:OpenJDK 1.8.0_312(java-1.8.0-openjdk,随 maven 依赖被拉入)
  • 本文目标 JDK:OpenJDK 17.0.1(java-17-openjdk-devel,el8 源内置版本)
  • 构建工具:Apache Maven 3.5.4(Red Hat 3.5.4-5,el8 源内置版本)
  • 组件版本:Apache Woden 1.0M10(org.apache.woden:woden-core:1.0M10)
  • 传递依赖:xmlschema-core 2.2.1、commons-logging 1.1.1
  • 官方 bin 包地址:https://archive.apache.org/dist/ws/woden/1.0M10/woden-1.0M10-bin.zip
  • 验证用工作目录:/root/woden-demo(工程)、/root/jar-run(jar 直跑)

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

cat /etc/os-release | head -2
uname -m
NAME="CentOS Linux"
VERSION="8"
x86_64

💡 说明:Woden 是库而非服务,「安装完成」的判定标准是可编译并运行一个解析 WSDL 2.0 的最小程序。el8 源里 Maven 是 3.5.4、JDK 17 是 17.0.1,都比 Ubuntu 22.04 的对应版本老,但实测均满足 Woden 1.0M10 的构建运行要求(woden-core 字节码基线为 Java 5,major 49)。

二、前置条件

本节说明安装前必须满足的条件。CentOS 8 的最大前置障碍是 EOL 软件源,必须先修复。

  1. 具有 root 或 sudo 权限的 CentOS 8 系统。
  2. 可访问阿里云镜像站 mirrors.aliyun.com(替代已下线的 mirror.centos.org)。
  3. 可访问 Apache 归档下载站 archive.apache.org 与 Maven 中央仓库 repo1.maven.org(本文实测网络直连可达)。
  4. 至少 2 GB 可用磁盘空间。

EOL 源的真实状态确认(实时回显):

curl -sI --max-time 15 http://mirror.centos.org/centos/8/os/x86_64/repodata/repomd.xml | head -2
HTTP/1.1 404 Not Found
Date: Thu, 15 Oct 2026 11:37:49 GMT

直接 yum makecache 会因 404 失败,须按第三章切换归档源后再安装。

三、修复 EOL 软件源(阿里云归档)

本节把 /etc/yum.repos.d/CentOS-Linux-*.repo 中的 mirrorlist 指向注释掉,baseurl 换到阿里云的 CentOS 归档路径:

sed -i -e 's|mirrorlist=|#mirrorlist=|g' \
       -e 's|#baseurl=http://mirror.centos.org|baseurl=https://mirrors.aliyun.com|g' \
       /etc/yum.repos.d/CentOS-Linux-*.repo
grep -E 'baseurl|mirrorlist' /etc/yum.repos.d/CentOS-Linux-AppStream.repo | head -3
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
baseurl=https://mirrors.aliyun.com/$contentdir/$releasever/AppStream/$basearch/os/

其中 $contentdir 变量默认展开为 centos,因此最终 URL 落在阿里云的 CentOS 8 归档目录。重建缓存验证:

yum makecache
# 输出节选(实测首尾)
CentOS Linux 8 - AppStream                      309 kB/s | 8.4 MB     00:27
CentOS Linux 8 - BaseOS                         473 kB/s | 4.6 MB     00:09
CentOS Linux 8 - Extras                          13 kB/s |  10 kB     00:00
Metadata cache created.

验证点:出现 Metadata cache created. 即源修复完成,后续 yum 安装恢复正常。

四、版本选型说明

本节给出 Woden 的版本谱系,数据来自 Maven Central 元数据在 CentOS 环境的实时查询(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:1.0M10(2015-09-06 发布)把旧的 woden-api/woden-common/woden-dom 三模块合并为单一 woden-core,移除 Axiom 实现,只保留 DOM 实现,字节码基线为 Java 5。本文实际采用 1.0M10:它是 Maven Central 上 woden-core 的唯一且最新版本,单 jar 即可用,且实测在 JDK 8 与 JDK 17 上均可运行(5.5 节验证)。

💡 技术拓展:WSDL 1.1 与 WSDL 2.0 是两个不同的规范——WSDL 1.1(2001 年,<definitions> 根元素)是事实标准;WSDL 2.0(2007 年 W3C Recommendation,<description> 根元素)重构了组件模型并引入 MEP。Woden 只支持 WSDL 2.0:实测把 WSDL 1.1 文档喂给 Woden 会得到致命错误 WSDL514(复现与官方转换链路见第 3 篇《Apache Woden 1.0M10 快速入门与集成示例》第五章)。若要解析 WSDL 1.1,Java 生态的常用替代是 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 项目开发:yum 安装 JDK 17 与 Maven,显式设置 JAVA_HOME,再用 Maven 坐标引入 woden-core 依赖并跑通最小验证程序。

5.1 方案说明

方案 A 的链路是:yum 安装 java-17-openjdk-devel 与 maven → 显式导出 JAVA_HOME 指向 JDK 17 → pom.xml 声明 org.apache.woden:woden-core:1.0M10 → Maven 下载 jar 与 2 个传递依赖 → 编译运行验证程序。el8 的关键差异在于:mvn 默认绑定到系统缺省 JDK 1.8,必须显式设置 JAVA_HOME(5.2 节实测)。

5.2 安装 JDK 17 与 Maven,并绑定 JAVA_HOME

yum install -y -q java-17-openjdk-devel maven
java -version
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode, sharing)

注意:安装后 java 命令仍指向 1.8.0_312——java-17-openjdk-devel 依赖的是 headless 子包,不会自动接管系统缺省 java。确认 Maven 当前绑定的 JDK:

mvn -v
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 1.8.0_312, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64/jre

实测 el8 的 Maven 不读 PATH 推断,显式导出 JAVA_HOME 后立即切换:

export JAVA_HOME=/usr/lib/jvm/java-17 && mvn -v
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 17.0.1, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64

验证点:Java version 变为 17.0.1 即绑定成功。建议把 export JAVA_HOME=/usr/lib/jvm/java-17 写入 /etc/profile.d/jdk17.sh 或当前用户 ~/.bash_profile,否则新会话会退回 1.8。

5.3 创建工程并引入依赖

建立最小 Maven 工程(文件路径 /root/woden-demo/pom.xml):

mkdir -p /root/woden-demo/src/main/java
<?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:唯一运行期依赖,传递依赖 xmlschema-core 2.2.1 与 commons-logging 1.1.1 由 Maven 自动解析。不要使用 org.apache.woden:woden 坐标(实测它只是聚合 POM,不含 jar),也不要用 1.0M9 时代的 woden-api+woden-impl-dom 三 jar 组合。
  • maven.compiler.release=17:按 JDK 17 语义编译。若要兼容 JDK 8 目标机,可改 8。
  • maven-compiler-plugin 固定 3.11.0:要求 Maven 3.6.3 以下版本注意,3.5.4 实测可用(该插件 3.11.0 的 Maven 基线为 3.6.3,但 3.5.4 下实测编译通过;若遇到插件版本告警,可降到 3.8.1,同样支持 release 属性)。
  • project.build.sourceEncoding=UTF-8:源码含中文时防 unmappable character。

5.4 最小验证代码与 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):

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

5.5 编译与运行验证

编译(JAVA_HOME 已在 5.2 节导出):

cd /root/woden-demo && mvn -q -B compile
echo "EXIT=$?"
EXIT=0

生成 classpath 清单并运行(先用 $JAVA_HOME/bin/java 显式指定 JDK 17):

mvn -q -B dependency:build-classpath -Dmdep.outputFile=/root/cp.txt
$JAVA_HOME/bin/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

这里有一个 el8 特有的真实坑值得记录:如果直接用 java(而不是 $JAVA_HOME/bin/java)运行,系统缺省 JDK 仍是 1.8,会报类版本错误,实测回显:

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: WsdlParse has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0

这是因为应用类按 JDK 17 编译(major 61),而 1.8 只认到 52.0——与 Woden 无关(woden-core 是 major 49,1.8 也能跑它)。根治办法是把 17 设为系统缺省 java,见第八章。

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

6.1 方案说明

链路是:从 archive.apache.org 下载 woden-1.0M10-bin.zip → 校验 sha1 → 解压得到 6 个 jar → 用 javac -cp 编译源码 → 用 java -cp 运行。解析库运行期只需其中 3 个 jar:woden-core-1.0M10.jar(374014 字节)、xmlschema-core-2.2.1.jar(171989 字节)、commons-logging-1.1.1.jar(60686 字节)。

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

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

6.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 实测清单:

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 任务。

6.4 javac 编译与 java 运行

cd /root/jar-run
cp /root/woden-demo/src/main/java/WsdlParse.java .
cp /root/wsdl/StockQuote.wsdl .
mkdir -p out
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 仓库是同一份构件。

💡 说明:javac -d 指定的输出目录必须事先存在,否则报 directory not found: out(实测遇到过);上面的命令已含 mkdir -p out。

七、方案对比与选择建议

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

选型建议:有构建体系一律选方案 A;无构建工具的老旧 el8 服务器临时验证、或需要离线 Javadoc 与 WSDL 1.1 转换工具时选方案 B。

八、基础配置:多 JDK 切换

el8 的 JDK 管理是本篇的重点配置项。系统里同时存在 1.8 与 17,涉及两套机制。

机制一:JAVA_HOME(影响 Maven)。 仅对 mvn 生效,5.2 节已实测:不设置时 Maven 用 1.8.0_312,export JAVA_HOME=/usr/lib/jvm/java-17 后用 17.0.1。该变量只对当前会话有效,持久化需写入 profile。

机制二:alternatives(影响 java 命令)。 实测有一个真实坑:只装 java-17-openjdk-devel 时,alternatives 的 java 组里没有 17 的候选,直接指定路径会失败:

alternatives --set java /usr/lib/jvm/java-17-openjdk/bin/java
/usr/lib/jvm/java-17-openjdk/bin/java has not been configured as an alternative for java

解法是补装 java-17-openjdk 主包(它会向 java 组注册候选,家族名为 java-17-openjdk.x86_64),再用家族名切换:

yum install -y -q java-17-openjdk
alternatives --set java java-17-openjdk.x86_64
java -version
openjdk version "17.0.1" 2021-10-19 LTS
OpenJDK Runtime Environment 21.9 (build 17.0.1+12-LTS)
OpenJDK 64-Bit Server VM 21.9 (build 17.0.1+12-LTS, mixed mode, sharing)

切换后,普通 java 命令即可运行 5.5 节编译出的应用类(实测回显与该节一致),不必再带 $JAVA_HOME/bin/java 前缀。代码级配置方面,Woden 1.0M10 的 WSDLReader 只支持 FEATURE_VALIDATION 一个 feature 开关(接口上其余常量传入会报 IllegalArgumentException),错误收集通过给 reader.getErrorReporter() 挂自定义 ErrorHandler 实现,用法见 5.4 节代码与第 5 篇详解。

九、验证清单

检查项预期(实测值)不符时排查
yum makecacheMetadata cache created.源未切阿里云归档 → 第三章
mvn -v 的 Java version 行17.0.1(设 JAVA_HOME 后)仍显示 1.8.0_312 → 5.2 节
mvn -q -B compile 退出码0报 Source option 5 → 5.3 节 compiler 插件说明
java -version17.0.1(切换 alternatives 后)仍为 1.8 → 第八章
运行首行工厂实现 : org.apache.woden.internal.DOMWSDLFactoryNoClassDefFoundError → classpath 缺 xmlschema-core 或 commons-logging
运行末行PARSE_OKWSDLException ... WSDL514 → 输入是 WSDL 1.1 文档
运行报 UnsupportedClassVersionError ... 61.0 ... 52.0不应出现java 仍指向 1.8 → 第八章

十、常见问题(FAQ)

Q1:yum makecache 报 Failed to download metadata for repo 'appstream' 或镜像 404/403? CentOS 8 已 EOL,mirror.centos.org 已下线,实测对 repomd.xml 返回 HTTP/1.1 404 Not Found。按第三章把 baseurl 切到 https://mirrors.aliyun.com/$contentdir/$releasever/... 即可恢复。

Q2:mvn -v 显示的是 JDK 1.8,怎么切到 17? el8 的 Maven 不做 PATH 推断,必须显式 export JAVA_HOME=/usr/lib/jvm/java-17(5.2 节实测前后对比)。需要持久化时写入 /etc/profile.d/jdk17.sh。

Q3:alternatives --set java /usr/lib/jvm/java-17-openjdk/bin/java 报 has not been configured as an alternative for java? 只装了 devel 包,java 组没有 17 的候选。先 yum install -y java-17-openjdk(主包负责注册),再用家族名切换:alternatives --set java java-17-openjdk.x86_64(第八章实测通过)。

Q4:运行报 UnsupportedClassVersionError: ... class file version 61.0 ... up to 52.0? 应用类按 JDK 17 编译但 java 命令仍是 1.8。临时用 $JAVA_HOME/bin/java 运行,或按 Q3 把系统缺省 java 切到 17。这与 Woden 无关——woden-core 本身是 Java 5 字节码。

Q5:运行报 WSDLException ... 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 文档,Woden 只支持 WSDL 2.0。改用 WSDL 2.0 文档,或先用 bin 包内 woden-tool-1.0M10.jar 的 org.apache.woden.tool.converter.Convert 把 1.1 转成 2.0(完整实测见第 3 篇第五章)。

Q6:mvn compile 报 unmappable character for encoding 或运行时中文乱码? pom 加 project.build.sourceEncoding=UTF-8;java 命令加 -Dfile.encoding=UTF-8。

十一、卸载与清理

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(仅当不再需要)。yum 在事务检查阶段会先列出将删除的包并要求确认,核对清单无误后再按 y 执行:

yum remove java-17-openjdk-devel java-17-openjdk maven

将涉及的 3 个包可用 rpm -q 预先确认(实测回显,即 yum 事务清单里的同名包):

rpm -q java-17-openjdk java-17-openjdk-devel maven
java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64
java-17-openjdk-devel-17.0.1.0.12-2.el8_5.x86_64
maven-3.5.4-5.module_el8.0.0+39+6a9b6e22.noarch

系统缺省的 1.8 如不再需要,可同样方式移除:yum remove java-1.8.0-openjdk java-1.8.0-openjdk-devel。

十二、参考链接

  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. 阿里云 CentOS 归档镜像:https://mirrors.aliyun.com/centos/
  5. W3C WSDL 2.0 规范:https://www.w3.org/TR/wsdl20/
  6. WSDL 2.0 规范入门(Primer):https://www.w3.org/TR/wsdl20-primer/