0

在 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验证功能导出/导入完整性,但失败了。

4

2 回答 2

4

在 OSGi 中,version=1.3 的导入等价于 version="[1.3,∞)"。请参阅第 3.2.6 节“版本范围”。这是出于历史原因。

您应该始终在导入包语句中使用完整的版本范围。

于 2013-09-30T17:00:54.787 回答
0

不,OSGi 中的包导入不是,重复不是,不同的处理方式。OSGi 从不为其自己的服务或代码制造异常,它是完全对称的。

正如 BJ 在他的回答中所说,版本 X 的导入实际上是 X 和更高版本的导入。

于 2013-10-01T06:52:56.007 回答