如何自动解析Eclipse RCP的OSGi/Tycho传递依赖,替代手动排查diag错误?
问题背景
我基于以下技术构建Eclipse RCP(纯e4)应用:
- Eclipse Foundation Eclipse RCP (pure e4)
- Tycho
- p2 target platform
- SimpleConfigurator(基于bundles.info的产品)
- Apache Felix Gogo console
尝试给打包后的产品添加org.eclipse.equinox.slf4j和org.eclipse.equinox.log.stream两个日志相关bundle时,遇到了大量传递依赖缺失的问题,比如:
Missing org.slf4j -> need slf4j.api Missing osgi.serviceloader.processor -> need org.apache.aries.spifly.dynamic.bundle Missing org.objectweb.asm -> need org.objectweb.asm Missing org.osgi.util.pushstream -> need org.osgi.util.pushstream ...
目前只能反复执行diag <bundleId>排查缺失依赖,再手动添加到target中,然后重新构建——这个过程非常繁琐,且完整Tycho构建耗时数小时。
核心问题
有没有工具或工作流能在构建Eclipse RCP产品时,自动解析并包含指定bundle/IU的完整传递依赖链?比如指定org.eclipse.equinox.slf4j后,自动把所有依赖bundle引入到目标/产品中,替代手动逐个排查的方式?
已尝试方案
- 向
.target添加单个IU - 手动编辑SimpleConfigurator的
bundles.info - 在Gogo中使用
diag命令 - 在.product编辑器中使用“Add Required Plug-ins”(部分场景有效,但无头Tycho构建中不总是生效)
解决方案与最佳实践
1. Tycho自动依赖解析配置
在Tycho构建中,通过以下配置让构建自动处理依赖闭包:
- .product文件配置:打开.product编辑器,切换到「Dependencies」标签,添加目标IU后,勾选「Add required plug-ins」,若需要可选依赖,可在「Advanced」设置中启用「Include optional dependencies」。同时在Tycho的pom.xml中确保配置启用p2依赖解析:
<plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>tycho-maven-plugin</artifactId> <version>${tycho-version}</version> <extensions>true</extensions> </plugin> <plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>tycho-target-platform-configuration</artifactId> <version>${tycho-version}</version> <configuration> <target> <artifact> <groupId>your.group.id</groupId> <artifactId>your.target</artifactId> <version>1.0.0</version> </artifact> </target> <resolveWith>p2</resolveWith> </configuration> </plugin> - Target Platform使用IU集合:不要手动在target中添加单个bundle,而是添加包含目标IU的p2仓库IU,让Tycho自动拉取完整依赖链。
2. p2 Director命令行工具
用p2 Director直接计算依赖闭包并生成所需的bundle列表:
eclipse -application org.eclipse.equinox.p2.director \ -repository https://download.eclipse.org/releases/latest/ \ -installIU org.eclipse.equinox.slf4j,org.eclipse.equinox.log.stream \ -destination ./temp-profile \ -profile TempRCPProfile \ -listInstalled > required-ius.txt
执行后,required-ius.txt会包含所有依赖的IU,可直接将这些IU添加到target或product的依赖中。
3. 基于Feature的依赖管理
创建自定义Feature封装日志模块的依赖:
- 新建Feature项目,在
feature.xml的「Plug-ins」标签中添加org.eclipse.equinox.slf4j和org.eclipse.equinox.log.stream。 - 勾选「Include required plug-ins」,Feature会自动收集所有传递依赖。
- 在target或product中引用这个自定义Feature,Tycho构建时会自动解析整个依赖闭包。
4. p2 Dependency Analyzer工具
使用Eclipse自带的p2 Dependency Analyzer插件:
- 打开「Window > Show View > Other... > p2 > Dependency Analysis」。
- 输入目标IU(如
org.eclipse.equinox.slf4j),工具会展示完整的依赖链。 - 导出依赖列表,直接添加到target或product中。
推荐最佳实践
- 用Feature管理功能模块:避免在product中直接添加零散bundle,Feature能自动维护依赖闭包,简化版本和依赖管理。
- 让Tycho主导依赖解析:配置target platform使用p2仓库的IU集合,而非手动维护bundle列表,减少手动操作的错误。
- 避免手动编辑bundles.info:SimpleConfigurator的
bundles.info尽量通过Tycho构建自动生成,确保依赖一致性。 - 定期验证依赖完整性:用p2 Director或Dependency Analyzer工具定期检查依赖链,避免遗漏传递依赖。
内容的提问来源于stack exchange,提问作者user1165215
相关产品推荐
相关产品推荐

