我在将一个OSGi bundle加载到第三方框架时遇到了问题。它一直拒绝我的bundle,因为我指定的Import-Package版本不存在,尽管我知道它们正在加载我想要/需要的版本的bundles。为了解决这个问题,我暂时禁用了我的版本要求,但这有点丑陋。
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规范(第50页),但似乎无法理解这两个值之间的细微差别:
开发人员可以指定任意匹配属性。请参见第58页的属性匹配。以下任意匹配属性是预定义的:
• version - 选择导出程序包版本的版本范围。语法必须遵循第36页的版本范围。有关版本选择的更多信息,请参见第54页的语义化版本控制。如果未指定此属性,则假定为[0.0.0,∞)。
• specification-version - 此属性是版本属性的别名,仅为了便于从早期版本迁移。如果存在版本属性,则值必须相等。
• bundle-symbolic-name - 导出束的束符号名称。对于片段束,这将是主机束的符号名称。
• bundle-version - 选择导出束版本的版本范围。默认值为[0.0.0,∞)。请参见第54页的语义化版本控制。对于片段束,版本来自主机束。
请问有人能解释一下
version
和bundle-version
之间的区别吗?从我阅读文档的方式来看,bundle-version(即manifest中的Bundle-Version
)将扩展到包中的所有包。那么在Import-Package
语句上,包版本(即版本)不是与bundle-version(即bundle-version)相同吗?为什么可以以不同的方式指定这两个版本号?
package-info.java
中指定版本,但是看起来您正在使用预构建的二进制捆绑包。在这种情况下,导出版本纯粹由 MANIFEST.MF 中的Export-Package
标头定义。由于捆绑包没有指定任何版本,因此所有版本都为 0。 - Neil Bartlettbundle-version
属性。你还需要使用bundle-symbolic-name
属性,否则你将从任何包的X版本进行导入... 版本仅对于这个特定的包有意义。 - Neil BartlettRequire-Bundle
),并重新导出带有版本的这些软件包。这将把所有恶意内容放入一个特殊位置,并避免在其导入中使用奇怪属性来污染您的“普通”捆绑包。 - Neil Bartlett