我可以使用版本限定符来要求 OSGi 中的特定包版本吗?

Can I use version qualifiers to require specific package versions in OSGi?

我有一个我希望包装的第三方 JAR - 它没有自己的 OSGi 清单。例如,org.myprojectSo I create a bundle wrapper.

这很好用 - 我提供了 org.myproject 发布的版本。这是 org.myproject 的作者指定的。说,1.0.1.

现在,org.myproject 已更改,我想包含更改。但是,没有官方发布。这听起来我可以使用限定符来表示较新的版本:1.0.1.$timestamp

但是,当使用 bndtools 包装 JAR 时,包导出仍然版本化为 1.0.1

是否可以在 OSGi 中导出然后导入限定符特定的包版本?在 bndtools 中管理它的最佳方法是什么?

我们说的是什么版本?如果您在 bnd 中使用 1.2.3.XXXXX 对包进行版本控制,那么这就是您将作为导出获得的包版本。

但是,默认情况下,bnd 在基于导出创建导入范围时会去除限定符。您应该能够使用版本策略覆盖它。默认值是:

-provider-policy    = ${range;[==,=+)}
-consumer-policy    = ${range;[==,=+)}

您可以轻松更改它们以包含限定词。

然而,这将是一个全球性的变化,我希望你会后悔。

所以另一种解决方案是修改这个坏包的导入:

Import-Package org.myproject;version="${range;[====.=+);${@}}", *

当然,最简单的解决方案是结束它并接受将口红涂在猪身上并不会使其在语义上版本化。只需将版本与依赖项从您的捆绑包中分离出来。在那些情况下,我倾向于选择一个奇怪的主要数字,例如100,以表明我的版本不是目标版本。

由于我对那些项目有一些不愉快的回忆,我也可以建议您看一下 OSGi contracts。使用合同,您不需要对包进行版本控制,而是使用合同要求。

然后是最后一个,绝对是最好的,你真的需要对那个项目进行版本控制吗?我发现在大多数情况下,开发我自己的 OSGi API 来反映我对这个外部目标的需求是非常值得的。然后我可以将该包很好地隐藏在一个黑暗的地方,在那里它可能会因为没有进行语义版本控制而受到影响:-)