返回

Java 11 中 JAXB 缺失问题指南:原因与解决方案

java

Java 11 中 JAXB 缺失:原因与解决方案指南

引言

对于 Java 开发人员来说,JAXB(Java 架构绑定)是一个宝贵的工具,用于处理 XML 数据。然而,在 Java 11 中,javax.xml.bind 包已从标准库中移除。这给依赖于 JAXB 的开发人员带来了一个挑战。本文将深入探讨 JAXB 在 Java 11 中缺失的原因,并提供各种可行的解决方案。

JAXB 在 Java 11 中缺失的原因

Java 9 引入了模块系统,将 JRE 中的代码组织成模块,并指定其依赖项和版本。java.xml.bind 模块在 Java 9 中被标记为已弃用,并在 Java 11 中被完全删除。

解决方案:探索您的选择

1. 添加模块依赖

向您的项目中添加 jakarta.xml.bind 模块的依赖是一种解决方案。这可以通过在您的 pom.xml 文件中添加以下依赖项来实现:

<dependency>
  <groupId>jakarta.xml.bind</groupId>
  <artifactId>jakarta.xml.bind-api</artifactId>
  <version>3.0.1</version>
</dependency>
<dependency>
  <groupId>jakarta.xml.bind</groupId>
  <artifactId>jakarta.xml.bind-impl</artifactId>
  <version>3.0.1</version>
</dependency>

2. 使用 JAXB 2.3 API

对于希望保持与 Java 11 完全兼容的开发者来说,使用 JAXB 2.3 API 是一个选择。要使用 JAXB 2.3 API,请将以下依赖项添加到您的项目中:

<dependency>
  <groupId>com.sun.xml.bind</groupId>
  <artifactId>jaxb-impl</artifactId>
  <version>2.3.6</version>
</dependency>

3. 迁移到 JAX-B 3.0

如果您希望利用 JAXB 的最新版本,迁移到 JAX-B 3.0 是一个理想的选择。要迁移到 JAX-B 3.0,请添加以下依赖项:

<dependency>
  <groupId>com.sun.xml.bind</groupId>
  <artifactId>jaxb-core</artifactId>
  <version>3.0.2</version>
</dependency>

示例代码:解析 XML 文件

以下是用 JAX-B 3.0 解析 XML 文件的示例代码:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.validation.Schema;
import com.acme.foo.FooObject;

public class JaxbParser {

  public static void main(String[] args) {
    try {
      // 创建 JAXBContext
      JAXBContext context = JAXBContext.newInstance("com.acme.foo");

      // 创建 Unmarshaller
      Unmarshaller unmarshaller = context.createUnmarshaller();

      // 设置 Schema
      unmarshaller.setSchema(schema);

      // 反序列化 XML 文件
      FooObject fooObj = (FooObject) unmarshaller.unmarshal(new File("foo.xml"));
    } catch (UnmarshalException ex) {
      ex.printStackTrace();
    } catch (JAXBException ex) {
      ex.printStackTrace();
    }
  }
}

常见问题解答

  • 为什么 Java 11 中会移除 JAXB?
    Java 9 引入了模块系统,java.xml.bind 模块被标记为已弃用,并在 Java 11 中被完全删除。

  • 我可以添加模块依赖项来解决此问题吗?
    是的,您可以向项目中添加 jakarta.xml.bind 模块的依赖项来解决此问题。

  • 我应该使用 JAXB 2.3 API 还是 JAX-B 3.0?
    对于需要与 Java 11 完全兼容的应用程序,建议使用 JAXB 2.3 API。对于想要利用 JAXB 最新版本的应用程序,建议迁移到 JAX-B 3.0。

  • 如何解析 XML 文件?
    您可以使用 JAXBContextUnmarshallerSchema 来解析 XML 文件。

  • 迁移到 JAX-B 3.0 有什么优势?
    迁移到 JAX-B 3.0 的优势包括性能改进、支持新的 Java 功能以及对 XML Schema 1.1 的支持。

结论

在 Java 11 中解决 JAXB 缺失问题有多种方法,包括添加模块依赖项、使用 JAXB 2.3 API 或迁移到 JAX-B 3.0。通过仔细考虑每个选项并根据您的特定应用程序需求做出明智的决定,您可以继续在 Java 11 中有效地使用 JAXB。