使用JDK8编译项目并在JDK17运行,关于移除依赖的疑问
问题解答
核心结论
会出现移除依赖相关的运行时错误,仅用JDK8编译无法让项目在JDK17正常运行,必须显式添加对应的第三方依赖。
原因说明
- JDK8中
jdk.xml.bind(JAXB)、jdk.xml.ws(JAX-WS)是JDK自带的模块,但从JDK9开始这些模块被标记为废弃,JDK17中已完全移除。 - 编译阶段用JDK8能正常通过,因为编译时JDK提供了这些类;但运行时JDK17的环境里没有这些类的实现,会直接抛出
ClassNotFoundException或NoClassDefFoundError。
解决方案
需要在项目的依赖管理中添加以下第三方实现:
- JAXB依赖:使用GlassFish的JAXB运行时
<!-- Maven示例 --> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.8</version> <!-- 选择兼容JDK17的版本 --> </dependency> - JAX-WS依赖:使用JAX-WS RI套件
<!-- Maven示例 --> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-ri</artifactId> <version>2.3.5</version> <!-- 选择兼容JDK17的版本 --> <type>pom</type> </dependency>
额外注意事项
- 确保依赖版本与JDK17兼容,避免版本冲突;
- 如果项目使用模块化(
module-info.java),需要在模块声明中添加对这些库的依赖:module your.module.name { requires jakarta.xml.bind; // 对应JAXB requires jakarta.xml.ws.api; // 对应JAX-WS }
内容的提问来源于stack exchange,提问作者vashdivan
相关产品推荐
相关产品推荐

