bnd如何决定应用于导入包的版本范围?

har*_*are 2 apache osgi bnd

我有一个问题,我正在使用maven war插件构建一个战争并使用bnd插件覆盖它,如在不改变包装类型的情况下将OSGi元数据添加到现有项目中所述. 该项目定义了以下依赖项:

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.12</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

当我运行构建时,它在MANIFEST.MF中生成以下条目

Import-Package: .., javax.ws.rs.core,  ..
Run Code Online (Sandbox Code Playgroud)

只要我将版本更改为1.13或更高版本,Import-Package条目就会变为:

Import-Package: .., javax.ws.rs;version="[1.1,2)", ..
Run Code Online (Sandbox Code Playgroud)

这对我来说是一个真正的问题因为我的目标中有javax.ws.rs.javax.ws.rs-api_2.0.0.m16.哪个将解决无版本所需案例的导入,但在范围限制存在时停止这样做.

所以,我的一般问题是:bnd如何决定版本范围?两个次要版本之间发生了一些变化,使其从无版本限制变为特定范围,因此我认为了解bnd如何做出这一决定将有助于我发现这个特定问题是什么.

Nei*_*ett 8

Bnd使用OSGi语义版本控制 - 请阅读白皮书(PDF链接).

首先,bnd计算出在构建时使用了哪个版本的软件包.您在构建路径上拥有的JSR311 API Jar必须包含版本化Export-Package语句,这很好,并且该版本必须为1.1.因此,捆绑软件包可以使用的最低版本是1.1.

语义版本控制表示主要(即第一个)段增加以指示所有用户的重大变化.因此,您的软件包将与javax.ws.rs软件包的版本2.*不兼​​容.所以bnd会生成一个范围,但不包括2 ......即[1.1,2).

我不明白为什么这会导致你出问题.您声明要部署一个调用javax.ws.rs.javax.ws.rs-api_2.0.0.m16目标的捆绑包,但这看起来像文件名.您是否检查javax.ws.rs过捆绑包中的包是否为版本2?如果它仍然是版本1.*那么您可以使用它...如果它是版本2.*那么它意味着包中包含重大更改,因此您不应该使用它.最后,如果软件包的版本是2.*但它并不是真正的重大改变,那么创建该软件包的人已经搞砸了,他们需要返回并阅读我链接的PDF.