Java 11 包 javax.xml.bind 不存在

标签 java jakarta-ee jaxb java-11

我正在尝试使用 JAXB 将 XML 数据反序列化为 Java 内容树。 ,在解码时验证 XML 数据:

try {
  JAXBContext context = JAXBContext.newInstance("com.acme.foo");
  Unmarshaller unmarshaller = context.createUnmarshaller();
  unmarshaller.setSchema(schema);
  FooObject fooObj = (FooObject) unmarshaller.unmarshal(new File("foo.xml"));
} catch (UnmarshalException ex) {
  ex.printStackTrace();
} catch (JAXBException ex) {
  ex.printStackTrace();
}

当我使用 Java 8 构建项目时,一切正常,但使用 Java 11 构建项目会失败并出现编译错误:

package javax.xml.bind does not exist

如何解决这个问题?

最佳答案

根据release-notes ,Java 11 删除了 Java EE 模块:

java.xml.bind (JAXB) - REMOVED
  • Java 8 - 好的
  • Java 9 - 已弃用
  • Java 10 - 已弃用
  • Java 11 - 已删除

参见JEP 320了解更多信息。

您可以使用 Java EE 技术的替代版本来解决该问题。只需添加包含您需要的类的 Maven 依赖项即可:

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.0</version>
</dependency>
<dependency>
  <groupId>com.sun.xml.bind</groupId>
  <artifactId>jaxb-core</artifactId>
  <version>2.3.0</version>
</dependency>
<dependency>
  <groupId>com.sun.xml.bind</groupId>
  <artifactId>jaxb-impl</artifactId>
  <version>2.3.0</version>
</dependency>

Jakarta EE 8 更新(2020 年 3 月)

您可以使用 Jakarta XML Binding 来解决该问题,而不是使用旧的 JAXB 模块。来自Jakarta EE 8 :

<dependency>
  <groupId>jakarta.xml.bind</groupId>
  <artifactId>jakarta.xml.bind-api</artifactId>
  <version>2.3.3</version>
</dependency>
<dependency>
  <groupId>com.sun.xml.bind</groupId>
  <artifactId>jaxb-impl</artifactId>
  <version>2.3.3</version>
  <scope>runtime</scope>
</dependency>

Jakarta EE 9 更新(2020 年 11 月)

使用最新版本的 Jakarta XML Binding 3.0 :

<dependency>
  <groupId>jakarta.xml.bind</groupId>
  <artifactId>jakarta.xml.bind-api</artifactId>
  <version>3.0.0</version>
</dependency>
<dependency>
  <groupId>com.sun.xml.bind</groupId>
  <artifactId>jaxb-impl</artifactId>
  <version>3.0.0</version>
  <scope>runtime</scope>
</dependency>

注意: Jakarta EE 9 采用新的 API 包命名空间 jakarta.xml.bind.*,因此更新导入语句:

javax.xml.bind -> jakarta.xml.bind

Jakarta EE 10 更新(2022 年 6 月)

使用最新版本的 Jakarta XML Binding 4.0 (需要 Java SE 11 或更高版本):

<dependency>
  <groupId>jakarta.xml.bind</groupId>
  <artifactId>jakarta.xml.bind-api</artifactId>
  <version>4.0.0</version>
</dependency>
<dependency>
  <groupId>com.sun.xml.bind</groupId>
  <artifactId>jaxb-impl</artifactId>
  <version>4.0.0</version>
  <scope>runtime</scope>
</dependency>

关于Java 11 包 javax.xml.bind 不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53054254/

相关文章:

java - 如何将 ^M 分成单独的行?

model-view-controller - 关于 Java EE 6 架构的问题

enums - JAXB 不会为受限元素创建枚举

jaxb - 是否可以使 Map<?, ?> someMethod 与 JAX-B 一起工作?

java - 如何将单个 java bean 编码到具有现有注释的复杂 XML 文档中?

java - JSF 2 - 页面访问取决于用户角色

java - 重构包含无参数方法的 switch 语句

java - 我想在具有面板 ArrayList 的 ScrollPane 中使用 BoxLayout

java - Web 应用程序的容器管理安全性

java - 在servlet或任何其他J2EE技术​​中调用Java独立程序