OSGI Import-Package:版本与捆绑版本 - 有什么区别?
OSGI Import-Package: version vs bundle-version - what's the difference?
我无法将 OSGi 包加载到第三方框架中。它一直拒绝我的包,因为我指定了不存在的 Import-Package 版本,即使我知道他们正在加载我 want/need 版本的包。为了解决这个问题,我暂时禁用了我的版本要求,但是有点难看。
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
当我查看依赖项的清单时,我看到:
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
在向框架团队投诉后,他们告诉我需要在我的 Import-Package
语句中使用 bundle-version
而不是 version
,例如:
Import-Pacakge: org.apache.ws.security;bundle-version=[1.5.0,2)
我已经通读了 OSGi Specs (page 50),但似乎无法
了解这两个值之间的细微差别:
The developer can specify arbitrary matching attributes. See Attribute
Matching on page 58. The following arbitrary matching attributes are
predefined:
• version - A version-range to select the exporter's
package version. The syntax must follow Version Ranges on page 36. For
more information on version selection, see Semantic Versioning on page
54. If this attribute is not specified, it is assumed to be [0.0.0, ∞).
• specification-version - This attribute is an alias of the
version attribute only to ease migration from earlier versions. If the
version attribute is present, the values must be equal.
• bundle-symbolic-name - The bundle symbolic name of the exporting
bundle. In the case of a fragment bundle, this will be the host
bundle's symbolic name.
• bundle-version - A version-range to select
the bundle version of the exporting bundle. The default value is
[0.0.0, ∞). See Semantic Versioning on page 54. In the case of a
fragment bundle, the version is from the host bundle.
有人可以澄清 version
和 bundle-version
之间的区别吗?从我阅读文档的方式来看,捆绑版本(即:清单的 Bundle-Version
)将扩展到捆绑包中的所有包。那么包版本(即:version)是否与 Import-Package
语句中的 bundle-version(即:bundle-version)相同?为什么能够以不同的方式指定两者?
非常简单:bundle-version
将您绑定到导出包的版本,而 version
绑定到包本身的版本。
您几乎从不 想在导入时使用 bundle-version
。导出包的版本几乎无关紧要......事实上,当你导入一个包时,你甚至不应该关心导出它的包的身份。这是您关心的包,而不是它来自的包。
谁让你用bundle-version
的?这可能有一些非常特殊的原因,但我对此表示怀疑。更可能是告诉你这件事的人弄错了。
您问的是:
So wouldn't the package version (ie: version) be the same as the bundle-version (ie: bundle-version) on the Import-Package statement?
不,不是!捆绑包版本与包版本无关。当您更改包时,您会更改该包的版本。捆绑包只是一种交付机制。
更新
重新阅读您的问题,我注意到未指定依赖项导出的包的版本。这意味着框架正在将所有内容导出为版本 0.0.0,因为当未指定版本时这是 "default" 版本。强调的是,包的版本不会默认为它所在的包的版本。不幸的是,这个框架的作者似乎对 OSGi 没有很好的理解。
更新 2
由于您使用的框架不提供版本,我建议创建一个 no-code 包装器包,re-exports 附加正确版本的包。这构建起来非常简单,它将把所有丑陋的东西都放在一个地方。然后你的任何其他包都可以简单地导入具有正常版本的包。
由于您没有告诉我有问题的捆绑包的 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
header,包括版本范围。
我无法将 OSGi 包加载到第三方框架中。它一直拒绝我的包,因为我指定了不存在的 Import-Package 版本,即使我知道他们正在加载我 want/need 版本的包。为了解决这个问题,我暂时禁用了我的版本要求,但是有点难看。
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
当我查看依赖项的清单时,我看到:
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
在向框架团队投诉后,他们告诉我需要在我的 Import-Package
语句中使用 bundle-version
而不是 version
,例如:
Import-Pacakge: org.apache.ws.security;bundle-version=[1.5.0,2)
我已经通读了 OSGi Specs (page 50),但似乎无法 了解这两个值之间的细微差别:
The developer can specify arbitrary matching attributes. See Attribute Matching on page 58. The following arbitrary matching attributes are predefined:
• version - A version-range to select the exporter's package version. The syntax must follow Version Ranges on page 36. For more information on version selection, see Semantic Versioning on page 54. If this attribute is not specified, it is assumed to be [0.0.0, ∞).
• specification-version - This attribute is an alias of the version attribute only to ease migration from earlier versions. If the version attribute is present, the values must be equal.
• bundle-symbolic-name - The bundle symbolic name of the exporting bundle. In the case of a fragment bundle, this will be the host bundle's symbolic name.
• bundle-version - A version-range to select the bundle version of the exporting bundle. The default value is [0.0.0, ∞). See Semantic Versioning on page 54. In the case of a fragment bundle, the version is from the host bundle.
有人可以澄清 version
和 bundle-version
之间的区别吗?从我阅读文档的方式来看,捆绑版本(即:清单的 Bundle-Version
)将扩展到捆绑包中的所有包。那么包版本(即:version)是否与 Import-Package
语句中的 bundle-version(即:bundle-version)相同?为什么能够以不同的方式指定两者?
非常简单:bundle-version
将您绑定到导出包的版本,而 version
绑定到包本身的版本。
您几乎从不 想在导入时使用 bundle-version
。导出包的版本几乎无关紧要......事实上,当你导入一个包时,你甚至不应该关心导出它的包的身份。这是您关心的包,而不是它来自的包。
谁让你用bundle-version
的?这可能有一些非常特殊的原因,但我对此表示怀疑。更可能是告诉你这件事的人弄错了。
您问的是:
So wouldn't the package version (ie: version) be the same as the bundle-version (ie: bundle-version) on the Import-Package statement?
不,不是!捆绑包版本与包版本无关。当您更改包时,您会更改该包的版本。捆绑包只是一种交付机制。
更新
重新阅读您的问题,我注意到未指定依赖项导出的包的版本。这意味着框架正在将所有内容导出为版本 0.0.0,因为当未指定版本时这是 "default" 版本。强调的是,包的版本不会默认为它所在的包的版本。不幸的是,这个框架的作者似乎对 OSGi 没有很好的理解。
更新 2
由于您使用的框架不提供版本,我建议创建一个 no-code 包装器包,re-exports 附加正确版本的包。这构建起来非常简单,它将把所有丑陋的东西都放在一个地方。然后你的任何其他包都可以简单地导入具有正常版本的包。
由于您没有告诉我有问题的捆绑包的 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
header,包括版本范围。