Skip to content

移除的模块

JDK 11 是一次"大扫除"。

Oracle 把那些过时、无人维护、与现代 Java 方向不符的模块统统移除了。

为什么要移除这些模块

┌─────────────────────────────────────────────────────────────────┐
│                       JDK 11 模块清理                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  移除原因:                                                       │
│  1. 使用率极低(没人用 JAXB、JAX-WS 了)                           │
│  2. 维护成本高                                                    │
│  3. Jakarta EE 接手了这些技术的演进                                │
│  4. 减少 JDK 体积                                                 │
│                                                                  │
│  替代方案:                                                       │
│  直接引入 Maven/Gradle 依赖即可                                    │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

移除的模块一览

被移除的模块曾用包名现替代
Java XML Web Services (JAX-WS)javax.xml.ws.*jakarta.xml.ws.*
Java Architecture for XML Binding (JAXB)javax.xml.bind.*jakarta.xml.bind.*
CORBAjava.corba.*第三方实现
Java Transaction API (JTA)javax.transaction.*jakarta.transaction.*
JavaBeans Activation Frameworkjavax.activation.*jakarta.activation.*
Java EE 聚合模块java.se.ee单独引入所需模块

迁移实战

Maven 项目迁移

xml
<!-- JDK 8:直接用内置模块 -->
<!-- 无需任何配置 -->

<!-- JDK 11+:需要显式引入依赖 -->
<dependencies>
    <!-- JAXB -->
    <dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
        <version>4.0.2</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>4.0.5</version>
    </dependency>

    <!-- JAX-WS -->
    <dependency>
        <groupId>jakarta.xml.ws</groupId>
        <artifactId>jakarta.xml.ws-api</artifactId>
        <version>2.3.3</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-rt</artifactId>
        <version>4.0.3</version>
    </dependency>
</dependencies>

Gradle 项目迁移

groovy
dependencies {
    // JAXB
    implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.2'
    implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.5'

    // JAX-WS
    implementation 'jakarta.xml.ws:jakarta.xml.ws-api:2.3.3'
    implementation 'com.sun.xml.ws:rt:4.0.3'
}

错误诊断

典型错误

bash
# 编译时报错
Error: cannot find symbol
import javax.xml.bind.*;

# 运行时报错
java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

诊断命令

bash
# 检查 JAR 包依赖
jdeps --print-module-deps --module-path out your-app.jar

# 如果提示缺少 java.xml.bind 模块
jdeps --add-modules java.xml.bind --module-path out your-app.jar

# 查看模块依赖关系
jdeps --module-path out --dotoutput dot your-app.jar

迁移检查清单

  • [ ] 确认项目依赖了哪些被移除的模块
  • [ ] 在 Maven/Gradle 中添加对应的 Jakarta EE 依赖
  • [ ] 修改 import 语句:javax.*jakarta.*
  • [ ] 重新编译测试
  • [ ] 确认运行时无 NoClassDefFoundError

替代方案建议

JAXB 替代

java
// ❌ 旧方式(JDK 8 内置)
import javax.xml.bind.*;

// ✅ 新方式(JDK 11+ 外部依赖)
import jakarta.xml.bind.*;

JSON 处理

java
// JAXB 被移除后,推荐使用 JSON
// Jackson
import com.fasterxml.jackson.databind.ObjectMapper;

// Gson
import com.google.gson.Gson;

// JSON-B (Jakarta EE 标准)
import jakarta.json.bind.*;

小结

步骤操作
1. 识别找出项目中的 javax.xml.*javax.jws.*
2. 添加依赖Maven/Gradle 引入对应 Jakarta EE 库
3. 修改 importjavaxjakarta
4. 测试验证确保功能正常

大多数现代项目早就用 Jackson/Gson 处理 XML/JSON 了,影响不大。真正需要迁移的,是那些老旧的 SOAP Web Service 项目。

基于 VitePress 构建