如何为Eclipse e4 RCP应用添加依赖?Jersey依赖启动异常求助
这种OSGi环境下的依赖启动坑我之前踩过不少,咱们一步步拆解排查:
1. 先确认Jersey版本与包名的匹配性
首先得划个重点:Jersey 2.x系列用的是javax.ws.rs命名空间,但Jersey 3.x已经因为Jakarta EE迁移切换到jakarta.ws.rs了。你在MANIFEST里声明的是javax.ws.rs,那一定要确保从Orbit下载的Jersey是2.x版本——如果不小心拿了3.x的包,直接就会出现类找不到的致命错误。
2. 修正MANIFEST.MF的依赖声明方式
OSGi环境里**优先用Import-Package替代Require-Bundle**来声明依赖,除非你明确需要绑定整个bundle。比如你不需要直接依赖整个org.glassfish.jersey.core.jersey-client bundle,而是导入实际用到的具体包就行:
Import-Package: javax.ws.rs.client, javax.ws.rs.core, org.glassfish.jersey.client, org.glassfish.jersey.jackson.jackson2, com.fasterxml.jackson.databind;resolution:=optional
这种方式能避免不必要的bundle绑定,减少启动时的冲突概率。如果之前用的是Require-Bundle,建议换成这种写法试试。
3. 检查目标定义中的传递依赖是否完整
Jersey的几个核心bundle不是孤立的,它们有一串传递依赖:
org.glassfish.jersey.core.jersey-client依赖org.glassfish.jersey.core.jersey-common、org.glassfish.jersey.bundles.repackaged.jersey-guava等org.glassfish.jersey.media.jersey-media-json-jackson依赖com.fasterxml.jackson.core.jackson-databind、com.fasterxml.jackson.core.jackson-core、com.fasterxml.jackson.core.jackson-annotations以及Jersey核心包
你得确认这些隐性依赖的bundle也已经添加到目标定义里了。Orbit的Jersey包通常会配套发布这些依赖,去Orbit仓库找对应版本的bundle补进去就行。
4. 拿启动日志定位具体问题
启动失败时别瞎猜,先看Eclipse的Error Log(Window > Show View > Error Log)或者控制台输出:
- 如果是
ClassNotFoundException,说明某个类的包没被正确导入,或者对应的bundle没加载 - 如果是
BundleException: Could not resolve module,说明依赖链断了,缺了某个必须的bundle - 如果是
NoClassDefFoundError,大概率是版本冲突(比如同一个包有多个版本被加载)
根据日志里的具体提示,针对性地补依赖或者调版本。
5. 调整bundle的启动设置
有些Jersey相关bundle需要设置为自动启动,并且启动级别要合理(比如默认的4或更高)。你可以在目标定义里选中对应的bundle,检查Auto-Start是否勾选,启动级别别设得太低(比如0或1可能会打乱RCP框架的启动顺序)。
6. 排除版本冲突
如果你的RCP应用里还有其他第三方bundle,很可能存在版本冲突。比如别的bundle也依赖了不同版本的Jackson,就会出问题。这时候可以在MANIFEST.MF里给导入的包指定版本范围,比如:
Import-Package: com.fasterxml.jackson.databind;version="[2.13.0,2.14.0)", javax.ws.rs.client;version="[2.35.0,2.36.0)"
确保和你从Orbit下载的版本完全匹配。
内容的提问来源于stack exchange,提问作者Paul H




