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

时间:2013-05-17 00:44:08

标签: apache osgi bnd

我有一个问题,我正在使用maven war插件构建一个战争并使用bnd插件覆盖它,如Adding OSGi metadata to existing projects without changing the packaging type.中所述。此项目定义了以下依赖项:

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.12</version>
    </dependency>

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

Import-Package: .., javax.ws.rs.core,  ..

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

Import-Package: .., javax.ws.rs;version="[1.1,2)", ..

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

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

1 个答案:

答案 0 :(得分:8)

Bnd使用OSGi语义版本控制 - 请阅读whitepaper(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。