OSGI Import-Package:版本vs bundle-version - 差异是什么?

时间:2016-04-05 18:36:40

标签: java osgi osgi-bundle

我无法将OSGi捆绑包加载到第三方框架中。它一直拒绝我的捆绑包,因为我指定了不存在的Import-Package版本,即使我知道他们正在使用我想要/需要的版本加载捆绑包。为了解决这个问题,我暂时禁用了我的版本要求,但这有点难看。

Import-Package: com.ghc.ghTester.expressions,org.apache.ws.security;vers
 ion=0,org.apache.ws.security.components.crypto;version=0,org.apache.ws.
 security.message;version=0,org.apache.ws.security.message.token;version
 =0,org.apache.ws.security.processor;version=0

当我看到Manifest的依赖时,我看到了:

Bundle-Version: 1.5.11
Bundle-ClassPath: wss4j-1.5.11.jar
Bundle-Vendor: Apache
Export-Package: org.apache.ws.axis.security,
 org.apache.ws.axis.security.handler,
 org.apache.ws.security,
 org.apache.ws.security.action,
 org.apache.ws.security.components.crypto,
 org.apache.ws.security.conversation,
 org.apache.ws.security.conversation.dkalgo,
 org.apache.ws.security.handler,
 org.apache.ws.security.message,
 org.apache.ws.security.message.token,
 org.apache.ws.security.processor,
 org.apache.ws.security.saml,
 org.apache.ws.security.transform,
 org.apache.ws.security.util

向框架团队抱怨后,他们告诉我,我需要在bundle-version声明中使用version而不是Import-Package,例如:

Import-Pacakge: org.apache.ws.security;bundle-version=[1.5.0,2)

我已阅读OSGi Specs (page 50),但似乎无法阅读 理解这两个值之间的细微差别:

  

开发人员可以指定任意匹配的属性。参见属性   匹配(第58页)。以下任意匹配属性   预定义:

     

•version - 用于选择导出器的版本范围   包版本。语法必须遵循第36页的版本范围   有关版本选择的更多信息,请参阅页面上的语义版本控制   54.如果未指定此属性,则假定为[0.0.0,∞)。

     

•specification-version - 此属性是。的别名   版本属性仅用于简化从早期版本的迁移。如果   如果存在版本属性,则值必须相等。

     

•bundle-symbolic-name - 导出的包符号名称   束。对于片段包,这将是主机   捆绑的符号名称。

     

•bundle-version - 要选择的版本范围   导出包的捆绑版本。默认值为   [0.0.0,∞)。请参阅第54页的语义版本控制。如果是   片段包,版本来自主机包。

有人可以澄清versionbundle-version之间的区别吗?从我阅读文档的方式来看,bundle-version(即:manifest' s Bundle-Version)将扩展到bundle中的所有包。那么包版本(即:version)是否与Import-Package语句中的bundle-version(即:bundle-version)相同?为什么有能力以不同的方式指定两者?

1 个答案:

答案 0 :(得分:9)

非常简单:bundle-version将您绑定到导出包的包的版本,而version绑定到包本身的版本。

您几乎从不想要在导入时使用bundle-version。导出包的版本几乎无关紧要......事实上,当您导入包时,您甚至不应该关心导出包的身份。它是你关心的软件包,而不是它来自的软件包。

谁告诉你使用bundle-version?可能有一些非常特殊的原因,但我对此表示怀疑。更有可能是告诉你这个人的错误。

你问:

  

那么包版本(即:version)是否与Import-Package语句中的bundle-version(即:bundle-version)相同?

不,不是!捆绑版本与包版本无关。更改包时,您可以更改该包的版本。捆绑只是一种交付机制。

<强>更新

重读您的问题,我注意到未指定依赖项导出的软件包的版本。这意味着框架将所有内容导出为版本0.0.0,因为这是&#34;默认&#34;未指定版本时的版本。包的版本着重并不默认为它所在的包的版本。不幸的是,这个框架的作者似乎对OSGi没有很好的理解。

更新2

由于您使用的框架不提供版本,我建议创建一个无代码包装程序包,它可以使用附加的适当版本重新导出包。这个构建起来非常简单,它将把所有的丑陋都保存在一个地方。然后,您的任何其他捆绑包都可以使用普通版本导入包。

由于您还没有告诉我有问题的捆绑包的BSN,我会称之为&#34; org.foo&#34;。首先创建一个名为manifest.txt的文件,如下所示:

Bundle-ManifestVersion: 2
Bundle-SymbolicName: org.foo.wrapper
Bundle-Version: 1.5.11
Require-Bundle: org.foo; bundle-version="[1.5.11,1.5.11]"
Export-Package: org.apache.ws.axis.security;version=1.5,
 org.apache.ws.axis.security.handler;version=1.5,
 ...

(显然我对这里的版本做了一些其他假设,你可以纠正。)

现在使用:

构建捆绑包
jar cfm wrapper.jar manifest.txt

现在您拥有此捆绑包,您的普通捆绑包可以导入这样的包:

Import-Package: org.apache.ws.security; version="[1.5,2)"

希望您使用的是基于bnd的工具,在这种情况下,将为您生成Import-Package标头,包括版本范围。