[英]OSGi: What's the difference between Import-Package/Export-Package and Require-Capability/Provide Capability?
[英]OSGI Import-Package: version vs bundle-version - what's the difference?
我无法将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
在向Framework团队抱怨之后,他们告诉我我需要在我的Import-Package
语句中使用bundle-version
而不是version
,例如:
Import-Pacakge: org.apache.ws.security;bundle-version=[1.5.0,2)
我已经阅读了OSGi规范(第50页) ,但似乎无法理解这两个值之间的细微差别:
开发人员可以指定任意匹配属性。 请参见属性匹配(第58页)。预定义了以下任意匹配属性:
•version - 用于选择导出程序包版本的版本范围。 语法必须遵循版本范围(第36页)。有关版本选择的详细信息,请参阅第54页的语义版本控制。如果未指定此属性,则假定为[0.0.0,∞)。
•specification-version - 此属性是version属性的别名,仅用于简化从早期版本的迁移。 如果存在version属性,则值必须相等。
•bundle-symbolic-name - 导出包的包符号名称。 对于片段包,这将是主机包的符号名称。
•bundle-version - 用于选择导出捆绑包的捆绑版本的版本范围。 默认值为[0.0.0,∞)。 请参见第54页的语义版本控制。对于片段包,版本来自主机包。
有人可以澄清version
和bundle-version
之间的区别吗? 从我阅读文档的方式来看,bundle-version(即:manifest的Bundle-Version
)将扩展到bundle中的所有包。 那么包版本(即:version)是否与Import-Package
语句中的bundle-version(即:bundle-version)相同? 为什么有能力以不同的方式指定两者?
它非常简单: bundle-version
将您绑定到导出包的bundle的版本,而version
绑定到包本身的版本。
你几乎从来没有想用bundle-version
进口。 导出包的版本几乎无关紧要......事实上,当您导入包时,您甚至不应该关心导出它的包的标识。 这是你关心的包,而不是它来自的包。
谁告诉你使用bundle-version
? 可能有一些非常特殊的原因,但我对此表示怀疑。 更有可能是告诉你这个的人错了。
您询问:
那么包版本(即:version)是否与Import-Package语句中的bundle-version(即:bundle-version)相同?
不,不是! 捆绑版本与包版本无关。 更改包时,您可以更改该包的版本。 捆绑只是一种交付机制。
UPDATE
重读您的问题,我注意到未指定依赖项导出的包的版本。 这意味着框架将所有内容导出为版本0.0.0,因为这是未指定版本时的“默认”版本。 一个软件包的版本着重并不默认它所在的软件包的版本。不幸的是,这个框架的作者似乎对OSGi没有很好的理解。
更新2
由于您使用的框架不提供版本,因此我建议创建一个无代码包装程序包,它可以使用附加的适当版本重新导出包。 这个构建起来非常简单,它将把所有的丑陋都保存在一个地方。 然后,您的任何其他捆绑包都可以使用普通版本导入包。
既然你没有告诉我有问题的捆绑的BSN,我会称之为“org.foo”。 首先创建一个名为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
标头。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.