Eclipse4.12+Java11插件运行报错:找不到com.sun.xml.internal.bind.v2.ContextFactory
解决Eclipse 4.12+Java11环境下JAXB Provider找不到的问题
这个报错我之前从Java8迁移到Java11的Eclipse插件项目时也踩过坑,核心原因很明确:Java 11已经把JAXB从JDK内置模块中移除了,你之前在Java8环境下,JAXB是JDK自带的组件,插件不需要额外依赖就能运行;但到了Java11,JAXB变成了第三方库,再加上Eclipse的OSGi插件类加载隔离机制,插件本身没声明依赖的话,ClassLoader根本找不到com.sun.xml.internal.bind.v2.ContextFactory这个类。
下面给你几个可行的解决步骤,按推荐程度排序:
1. 给插件添加JAXB的显式依赖(推荐,长期方案)
因为是OSGi插件环境,最好通过标准的依赖管理来解决:
- 如果用Maven/Gradle管理插件依赖,先添加JAXB的API和实现包:
Maven示例:<dependencies> <!-- JAXB API 核心包 --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <!-- JAXB 具体实现包 --> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.3</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> </dependency> <!-- JAXB依赖的activation模块 --> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> </dependencies> - 然后在插件的
MANIFEST.MF文件中,更新Import-Package节点,加入需要的JAXB包:Import-Package: javax.xml.bind;version="2.3.0", javax.xml.bind.annotation;version="2.3.0", com.sun.xml.bind.v2;version="2.3.0", // 保留你原本的其他导入包 - 另外要确保你的Eclipse Target Platform中包含这些JAXB的bundle,如果没有的话,可以从Maven仓库把这些jar转换成OSGi bundle添加进去。
2. 调整JAXB上下文的创建逻辑(避免依赖特定实现)
如果你的代码里硬编码依赖了Sun的JAXB实现,建议改成标准的JAXB API调用,这样能兼容不同的JAXB实现:
把原本可能存在的类似代码:
JAXBContext jaxbContext = JAXBContext.newInstance(YourClass.class, "com.sun.xml.internal.bind");
改成:
// 只传入需要序列化的类,用标准API创建上下文 JAXBContext jaxbContext = JAXBContext.newInstance(YourClass.class);
这样只要运行时存在JAXB的实现,ContextFinder就能自动找到合适的Provider,不用硬绑定Sun的实现类。
3. 临时调试方案(不推荐长期使用)
如果只是想快速验证功能,可以在Eclipse的Run Configuration中,给你的插件应用添加VM参数:
--add-modules java.se.ee
这个参数会把Java EE相关的模块(包括JAXB)重新添加到JDK模块中,但注意这个参数在Java 11之后是逐步废弃的,后续Java版本可能会移除,所以只适合临时调试用,不能作为最终解决方案。
内容的提问来源于stack exchange,提问作者Java dev
相关产品推荐
相关产品推荐

