You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:04:14