我试图使用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

我如何解决这个问题?


当前回答

根据发布说明,Java 11删除了Java EE模块:

java.xml.bind (JAXB) - REMOVED

java8 - OK 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:

Jakarta EE 9 API Jakarta .xml.bind- API 兼容的实现jaxb-impl

<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。*,因此更新import语句:

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

雅加达EE 10更新(2022年6月)

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

Jakarta EE 10 API Jakarta .xml.bind- API 兼容的实现jaxb-impl

<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删除了Java EE模块:

java.xml.bind (JAXB) - REMOVED

java8 - OK 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:

Jakarta EE 9 API Jakarta .xml.bind- API 兼容的实现jaxb-impl

<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。*,因此更新import语句:

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

雅加达EE 10更新(2022年6月)

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

Jakarta EE 10 API Jakarta .xml.bind- API 兼容的实现jaxb-impl

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