Java 11中不存在javax.xml.bind包

356

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

我该如何解决这个问题?


@Wolfgang,如果我们持有这样的软件演进观点,我们就会停留在Java 1.1时代。我不能完全同意你在维基上表达的观点。是的,他们打破了向后兼容的承诺,但只是为了跟上时代的步伐。 - Boris
1
当我在控制台上设置了Java 11时,使用maven.compiler.source=1.8或version.java.source=1.8在poms中运行maven构建时,出现了“package javax.xml.bind不存在”的错误。 通过将java_home本地环境变量设置为Java 8 SDK来解决此问题:“set java_home=path_to_java_8”。 - electrobabe
1个回答

694
根据这份发布说明,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 Binding3.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.*,因此请更新导入语句:


注意: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>

3
我正在将一个Spring Boot 2.1.0应用程序升级到Java 11,但每次启动JAR时都会输出:初始化引导层时发生错误java.lang.module.FindException:找不到模块java.xml.bind。我添加了这三个依赖项,但没有运气。还需要其他东西或需要检查的内容吗?我正在运行java 11.0.1。 - wsams
1
我不得不添加上述依赖项并从Maven编译器插件中删除开关 _--add-modules=java.xml.bind_。 - Lars Behnke
4
版本不正确。最新版本是: jaxb-api:2.3.1 jaxb-core:2.2.11 jaxb-impl:2.0.2 您可以在https://mvnrepository.com/artifact/javax.xml.bind上检查最新版本。 - Juan García
2
@ivan_drago 你能试着添加 jaxb-runtime 依赖吗? <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.2</version> </dependency> - Boris
1
@Graham Leggett,感谢您指出这一点,我已经更新了答案,并加入了 Jakarta EE 8 兼容的实现依赖。同时更新了答案,并加入了 Jakarta EE 9。 - Boris
显示剩余14条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接