移除的模块
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.* |
| CORBA | java.corba.* | 第三方实现 |
| Java Transaction API (JTA) | javax.transaction.* | jakarta.transaction.* |
| JavaBeans Activation Framework | javax.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. 修改 import | javax → jakarta |
| 4. 测试验证 | 确保功能正常 |
大多数现代项目早就用 Jackson/Gson 处理 XML/JSON 了,影响不大。真正需要迁移的,是那些老旧的 SOAP Web Service 项目。
