Liferay 7中Web Service的JSON依赖解析失败问题求助
你遇到的是OSGi模块化环境里典型的API与实现分离引发的依赖缺失问题——你只引入了JSON的规范API包(javax.json-api),但这个包只有接口定义,没有实际的代码实现逻辑。OSGi容器找不到能提供javax.json相关类实例的bundle,自然无法解析你的服务模块,导致它一直停留在Installed状态,启动时抛出BundleException。
下面是具体的解决步骤:
1. 补充JSON实现依赖到build.gradle
你需要在构建文件中添加JSON的官方实现包(GlassFish提供的javax.json),它包含了javax.json-api的具体实现,能满足OSGi的依赖需求。修改你的build.gradle依赖配置:
// 可保留API包(实现包会自动依赖API,也可省略这一行) implementation group: "javax.json", name: "javax.json-api", version: "1.1.2" // 必须添加的实现包 implementation group: "org.glassfish", name: "javax.json", version: "1.1.2"
注:如果用的是新版本Gradle,推荐用
implementation替代旧的compile指令。
2. 确保OSGi包导入配置正确
如果你的项目用Gradle的OSGi插件生成bundle,要保证Import-Package指令包含javax.json相关包。可以在build.gradle里显式配置:
osgi { instructions { Import-Package 'javax.json.*', '*' // 通配符*确保其他依赖也能被正确导入 } }
这样插件会自动生成符合要求的MANIFEST.MF文件,告诉OSGi容器你的bundle需要哪些依赖包。
3. 手动安装实现bundle(部署后仍有问题时用)
如果你的OSGi容器(比如Apache Karaf)里没预先安装javax.json实现bundle,可在Gogo Shell中手动安装:
install mvn:org.glassfish/javax.json/1.1.2
安装完成后再启动你的服务:
start 809
4. 诊断具体缺失依赖
要是问题还没解决,用OSGi的诊断命令查看模块的具体依赖缺失情况:
bundle:diag 809
这个命令会列出所有无法解析的依赖项,帮你精准定位是否还有其他缺失的bundle。
简单来说:OSGi环境里,接口类(API)和实现类必须由各自对应的bundle提供,只引入API包没法让容器实例化相关类,补充实现包才能让服务正常激活。
内容的提问来源于stack exchange,提问作者Roy

