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

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

不使用旧的JAXB模块,您可以通过使用Jakarta EE 8中的Jakarta XML Binding来解决这个问题:

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

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

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

Java相关问答推荐

Java Swing绘制gif作为多个JSYS和JLabels的背景

当我用OkHttpClient重写shouldInterceptRequest来发布数据时,Android WebView正在以纯HTML加载URL内容

转换为Biggram

为什么我们不能实现两个接口,其中一个接口有相同的签名,其中一个接口有默认的实现在java?'

ApachePOI:不带换行的新行

基本时态运算的ISO-8601周数据表示法

使用传递的参数构造异常的Mockito-doThrow(或thenThrow)

为什么在maven中,getLast方法不适用于List?

Com.google.firebase.database.DatabaseException:无法将类型为java.lang.Boolean的值转换为字符串.这是关于什么的?

Log4j与jdk21兼容吗?

我怎样才能让IntelliJ标记toString()的任何实现?

Groovy/Java:匹配带引号的命令选项

Java 11 HttpCookie.parse在解析包含JSON的Cookie时引发IlLegalArgumentException

Spring Boot中的应用程序.properties文件中未使用的属性

在Spring Boot JPA for MySQL中为我的所有类创建Bean时出错?

如何在运行docker的应用程序中获取指定的配置文件

为什么我不能建立输入/输出流?Java ServerSocket

如何使用jooq更新记录?

无法使用Open WebStart Java 8运行jnlp

JPA无手术同品种器械可能吗?