Java 17中rt.jar缺失,求替代Jar及JAXBContextImpl.class解决方案
Java 17 中 rt.jar 替代及 JAXB 相关问题解决方案
1. Java 17 可替代 rt.jar 的 Jar 包
Java 9 开始采用模块化架构,rt.jar 被拆分为多个核心模块对应的模块化文件,不存在单一替代 Jar,按需处理即可:
- 基础核心类(如
java.lang、java.util下的类):Java 17 环境默认包含这些核心模块,无需额外引入依赖。 - 原 rt.jar 中被移除的非核心 API(如 JAXB、JAX-WS):需单独引入对应 Jakarta EE 迁移版或第三方实现依赖,以 Maven 为例:
<!-- JAXB API 及实现 --> <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.4</version> <scope>runtime</scope> </dependency>
- 原 rt.jar 中的非标准
com.sun开头工具类:优先替换为 Java 标准 API(如sun.misc.BASE64Encoder替换为java.util.Base64),若必须保留,可查找第三方维护的对应 Jar。
2. JAXBContextImpl.class 的获取途径
JAXBContextImpl 是原 Oracle JDK 中 JAXB 的私有实现类,Java 17 已移除,获取方式:
- 引入上述
com.sun.xml.bind:jaxb-impl依赖,该 Jar 中包含com.sun.xml.bind.v2.runtime.JAXBContextImpl类,引入后可在运行时访问。 - 注意:直接依赖该类属于耦合具体实现,不推荐,建议面向 JAXB 标准 API 编程。
3. JAXBContextImpl.class 的替代类
无需直接依赖 JAXBContextImpl,推荐以下替代方案:
- 标准 API 编程:通过
JAXBContext.newInstance()静态方法获取实例,该方法会自动加载类路径中的 JAXB 实现,无需指定具体实现类:
JAXBContext context = JAXBContext.newInstance(YourEntityClass.class);
- Jakarta 官方实现:使用
org.glassfish.jaxb:jaxb-runtime依赖中的org.glassfish.jaxb.runtime.v2.JAXBContextImpl,但同样建议面向 API 而非具体实现。 - 第三方实现:如 EclipseLink MOXy,引入依赖后,
JAXBContext.newInstance()会自动使用其实现,代码无需修改:
<dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.moxy</artifactId> <version>4.0.2</version> </dependency>
内容的提问来源于stack exchange,提问作者Rakesh
相关产品推荐
相关产品推荐

