Java 11 包 javax.xml.bind 不存在 [重复]

Posted

技术标签:

【中文标题】Java 11 包 javax.xml.bind 不存在 [重复]【英文标题】:Java 11 package javax.xml.bind does not exist [duplicate] 【发布时间】:2019-03-01 07:32:52 【问题描述】:

我正在尝试使用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 时代。我不能完全同意您在 wiki 中表达的观点。是的,他们违背了向后兼容的承诺,但只是为了与时俱进。 在 poms 但 java 中使用 maven.compiler.source=1.8 或 version.java.source=1.8 运行 maven 构建时出现错误“包 javax.xml.bind 不存在” 11套在控制台上。通过将 java_home 本地环境变量设置为 Java 8 SDK 来修复:“set java_home=path_to_java_8” 【参考方案1】:

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

Jakarta EE 9 更新(2020 年 11 月)

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

雅加达 EE9 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.*,因此更新导入语句:

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

【讨论】:

我正在将 Spring Boot 2.1.0 应用程序升级到 Java 11,但每次启动 JAR 时它都会输出:启动层 java.lang.module.FindException 初始化时出错:模块 java .xml.bind 未找到。我添加了这三个依赖项,但没有运气。还有什么需要检查的吗?我正在运行 java 11.0.1。 我必须添加上述依赖项并从 maven 编译器插件中删除开关 --add-modules=java.xml.bind 版本不正确。最新版本是: jaxb-api:2.3.1 jaxb-core:2.2.11 jaxb-impl:2.0.2 您可以在以下位置查看最新版本:mvnrepository.com/artifact/javax.xml.bind 由于 Java SE 和 EE 的分离,后者被称为 Jakarta,依赖关系实际上不再在 com.sun.xml.bind 中,而是在 jakarta.xml.bind 中。从版本 2.3.2 开始的所有内容。当前版本的 xml-bind 是 2.3.3。 mvnrepository.com/artifact/jakarta.xml.bind @ivan_drago 你能尝试添加jaxb-runtime 依赖吗? &lt;dependency&gt; &lt;groupId&gt;org.glassfish.jaxb&lt;/groupId&gt; &lt;artifactId&gt;jaxb-runtime&lt;/artifactId&gt; &lt;version&gt;2.3.2&lt;/version&gt; &lt;/dependency&gt;

以上是关于Java 11 包 javax.xml.bind 不存在 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

解决java.lang.ClassNotFoundException: javax.xml.bind.JAXBException

报错Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/...

java.lang.TypeNotPresentException: Type javax.xml.bind.JAXBContext not present

NoClassDefFoundError:由于缺少依赖关系,无法加载类groovy.xml.jaxb.JaxbGroovyMethods javax / xml / bind / Unmarshall

java.lang.TypeNotPresentException: Type javax.xml.bind.JAXBContext not present

Android项目 app项目 java.lang.ClassNotFoundException: javax.xml.bind.JAXBException 出错解决办法不是java或spring项目