使用bndtools无法通过Maven Central解析OSGi依赖问题排查
看起来你在切换bndtools的依赖仓库到Maven Central时遇到了依赖解析的问题,尤其是找不到org.apache.servicemix.bundles.junit;version=4.12。我来帮你梳理下可能遗漏的步骤和修复方案:
1. 修正MavenBndRepository的配置细节
你添加的Maven仓库配置方向是对的,但有几个小细节需要调整,避免配置歧义:
- 遵循bnd配置惯例,用冒号
:替代等号=声明插件,参数统一用分号;分隔; - 用
${build}(指向cnf下的build文件夹)替代${.},让索引文件路径更清晰,避免和其他文件混淆。
修正后的配置可以改成这样:
-plugin.5.Maven: \ aQute.bnd.repository.maven.provider.MavenBndRepository; \ releaseUrl=https://repo.maven.apache.org/maven2/; \ index="${build}/central.maven"; \ name="Maven"
如果之前生成过损坏的索引文件,建议先删除central.maven,让bnd重新生成完整索引。
2. 彻底清理旧的JPM仓库配置
你原来的-plugin.1.Central是把wrapper.Plugin和JPM.Repository绑定在一起的。如果只是删除JPM的配置行,剩下的wrapper插件会因为失去依赖而无法正常工作。建议直接替换整个旧的Central仓库配置,或者完全删除JPM相关代码,确保Maven仓库成为主要的远程依赖源:
# 优先使用Maven Central -plugin.1.MavenCentral: \ aQute.bnd.repository.maven.provider.MavenBndRepository; \ releaseUrl=https://repo.maven.apache.org/maven2/; \ index="${build}/maven-central.index"; \ name="Maven Central" # 保留本地仓库等原有配置 -plugin.2.Local: \ aQute.bnd.deployer.repository.LocalIndexedRepo; \ name = Local; \ pretty = true; \ local = ${build}/local -plugin.3.Templates: \ aQute.bnd.deployer.repository.LocalIndexedRepo; \ name = Templates; \ pretty = true; \ local = ${build}/templates -plugin.4.Release: \ aQute.bnd.deployer.repository.LocalIndexedRepo; \ name = Release; \ pretty = true; \ local = ${build}/release
3. 手动触发仓库索引刷新与依赖拉取
bnd不会自动实时更新仓库索引,修改配置后需要手动触发刷新:
- 在Eclipse中右键点击cnf项目 → Bnd → Refresh Repositories,这会让bnd重新生成Maven仓库的索引,并尝试拉取缺失的依赖;
- 如果还是无法解析,尝试清理工作区:右键项目 → Clean,重启Eclipse后再执行一次Refresh Repositories。
4. 确认依赖声明的正确性
确保你的bundle的bnd文件中正确声明了依赖:
- 在
-buildpath中明确指定编译依赖:-buildpath: \ org.apache.servicemix.bundles.junit;version="[4.12,4.13)",\ # 其他依赖... - 如果是运行时依赖,确保
Import-Package中包含JUnit相关包(比如junit.framework、org.junit等),bnd会自动从Maven仓库匹配对应的OSGi bundle。
5. 检查本地Maven仓库与网络
MavenBndRepository会优先读取本地~/.m2/repository,如果本地没有目标依赖,bnd会自动从远程拉取,但网络或代理问题可能导致拉取失败:
- 可以手动用Maven命令拉取依赖到本地:
mvn dependency:get -DgroupId=org.apache.servicemix.bundles -DartifactId=junit -Dversion=4.12 - 检查Eclipse的网络代理设置,确保bnd可以正常访问Maven Central。
按照这些步骤调整后,应该就能正常解析Maven Central的依赖了。
内容的提问来源于stack exchange,提问作者Zymus
相关产品推荐
相关产品推荐

