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 依赖吗? <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.2</version> </dependency>
以上是关于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项目