升级org.glassfish.javax.json至1.1.2后出现JsonProviderImpl找不到错误
解决OSGi中升级org.glassfish.javax.json至1.1.2后找不到JsonProviderImpl的问题
可能的原因及对应解决方案
1. 检查org.glassfish.javax.json 1.1.2的包导出配置
从1.0.4升级到1.1.2后,该bundle可能调整了导出包列表。org.glassfish.json包(包含JsonProviderImpl)可能未被默认导出,导致你的bundle无法访问:
- 查看该bundle的MANIFEST.MF,确认是否包含
Export-Package: org.glassfish.json - 如果没有,可通过bnd工具修改bundle配置强制导出该包,或更换为适配OSGi的org.glassfish.javax.json发行版
2. 调整你的bundle依赖声明
仅依赖javax.json-api可能不足以让类加载器找到实现类,需补充对实现包的依赖:
- 在MANIFEST.MF中添加
Require-Bundle: org.glassfish.javax.json; resolution:=optional(保持可选依赖),或直接Require-Bundle: org.glassfish.javax.json - 也可使用
Import-Package: org.glassfish.json; resolution:=optional导入该包
3. 修复SPI服务发现的OSGi适配问题
OSGi类加载器隔离会导致标准Java SPI机制失效,1.1.2版本可能依赖OSGi服务注册而非SPI:
- 确认org.glassfish.javax.json 1.1.2启动时已注册
javax.json.spi.JsonProvider服务 - 若未自动注册,可在你的bundle中用
ServiceTracker手动获取服务:
ServiceTracker<JsonProvider, JsonProvider> tracker = new ServiceTracker<>(bundleContext, JsonProvider.class, null); tracker.open(); JsonProvider provider = tracker.getService(); // 用provider创建JsonFactory等实例
4. 调整Guice注入配置
Guice在OSGi环境下无法自动发现SPI实现,需显式绑定JsonProvider:
- 在Guice模块中添加绑定规则:
bind(JsonProvider.class).toInstance(JsonProvider.provider()); // 若通过OSGi服务获取实例,直接绑定获取到的provider对象
- 检查Guice使用的类加载器是否与你的bundle类加载器一致,确保能访问
org.glassfish.json.JsonProviderImpl
5. 验证bundle启动顺序
确保org.glassfish.javax.json 1.1.2在你的业务bundle之前启动,避免启动时无法访问实现类:
- 在OSGi容器中调整启动级别,将org.glassfish.javax.json设为更高优先级(如启动级别2),业务bundle设为更低级别(如启动级别5)
内容的提问来源于stack exchange,提问作者Ralf Mollik
相关产品推荐
相关产品推荐

