Java 11 package javax.xml.bind 不存在

2022-08-31 05:06:45

我正在尝试使用 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

如何解决此问题?


答案 1

根据发行说明,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>

雅加达EE 8更新(2020年3月)

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

<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>

雅加达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 包命名空间,因此更新 import 语句:jakarta.xml.bind.*

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

雅加达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>

答案 2

推荐