在 OSGi 中,定义的依赖关系的解析过程,即包导入和导出,在使用版本号和版本范围时非常严格。如果对于版本 1.2.3 的某些包导入没有找到范围包含 1.2.3 的对应导出,则无法解析或启动捆绑包。这很好。
但是,这似乎不适用于 core 包org.osgi.framework
。Equinox (3.8.0) 和 Apache Felix (4.0.3) 的当前版本都定义org.osgi.framework,version=1.7.0
为导出的包之一。但是,需要此软件包的特定较低版本的捆绑包,例如Import-Package: org.osgi.framework;version=1.3
,仍将其解析为此较新版本。我希望捆绑不会得到解决。
如何解释这种行为?这是 OSGi 实现的不当行为吗?我在解析核心 OSGi 包时遗漏了一个异常?或者 Karaf 是否妨碍了这里(我用 Apache Karaf 对此进行了测试,见下文)
我知道我宁愿不明确声明版本,并且版本会产生一个完全可解析的范围。但是,定义此类导入的捆绑包不受我控制(即:iPOJO,见下文)。
一些设置细节:我在 Karaf 2.3.2 和 2.3.3 中测试了这个,分别启用了 Equinox 或 Felix。你可以在 github上找到我用于测试的演示包,它可以按原样构建,并在部署到新的 Karaf 容器时显示失败。我发现这一点的原因是核心 iPOJO 包定义了这样的显式版本而不是范围。我将此添加到 Karaf 功能描述符中,并尝试使用Karaf Features Maven Plugin验证功能导出/导入完整性,但失败了。