OSGI有效版本范围
目前我正在尝试实现OSGI版本范围(针对不同的主题,但我喜欢他们定义版本范围的方式)。 但是我很难在OSGI中找到版本范围的具体定义。
不幸的是,OSGI API确实包含Version类,但不包含VersionRange类。 似乎所有OSGI容器都提出了自己对(有些不可修复的)版本范围定义的解释。
因此我有几个问题:
- 如果我使用
versionRange=1.4.0
,这会映射到Version> = 1.4.0吗? - 这是一个有效的版本范围:
versionRange=[1.0.0,0]
:我会说是(版本1.0.0到任何版本),Eclipse实现接受它作为版本但不能正确处理它。- 这是一个有效的versionRange以及:
versionRange=[1.0.0,0)
?
- 这是一个有效的versionRange以及:
- 所有这些问题的真实来源在哪里? 我似乎无法找到它。
版本范围在OSGi核心规范的第3.2.6节中精确定义。 你在当前的API中没有VersionRange
类是正确的,尽管在下一个规范版本中会有。
OSGi框架实现没有提出自己对范围的解释; 如果你发现一个特定框架解释范围与核心规范第3.2.6节不同的情况,请提出针对该框架的错误。
解决您的具体问题:
-
是的,
Import-Package
上的version=1.4.0
(或者Require-Bundle
上的bundle-version=1.4.0
)会非正式地映射到“version> = 1.4.0”。 -
我相信这两个版本范围都是有效的,但它们永远不会匹配任何版本。 例如,第一个示例仅匹配版本
x
,其中x >= 1.0.0
且x<=0
。 没有x
值可以满足这两个要求。 所以听起来Eclipse表现正常......它应该成功解析范围字符串但永远不会返回任何结果。 -
如前所述,如果您正在阅读文档的R4.3版本,那么“真相来源”是OSGi核心规范的第3.2.6节....第29页。
所以,按顺序回答你的具体问题:
- 如果我使用versionRange = 1.4.0,这会映射到Version> = 1.4.0吗?
是。 这正是规范说它应该被解释的方式(见下文)。
- 这是有效的版本范围:versionRange = [1.0.0,0]
是的,这是一个有效的范围,但它不会评估你似乎期待的。 它有效地评估了一组空的版本,因此没有版本会匹配此表达式。
- 这是一个有效的versionRange以及:versionRange = [1.0.0,0)?
与上面相同 – 它是有效的版本范围,但它将评估为空集。
- 所有这些问题的真实来源在哪里? 我似乎无法找到它
这些规格可在OSGi Alliance的主页上找到: http : //www.osgi.org/Release4/Download (适用于R4规格)
以下是OSGi R4核心规范的摘录,涵盖了版本范围:
版本范围
版本范围使用数学区间符号描述一系列版本。 参见[31]区间符号数学公约。
版本范围的语法是:
version-range ::= interval | atleast interval ::= ( '[' | '(' ) floor ',' ceiling ( ']' | ')' ) atleast ::= version floor ::= version ceiling ::= version
如果将版本范围指定为单个版本,则必须将其解释为范围
[version,
∞)
。 非指定版本范围的默认值为0,映射到[0.0.0,
∞)
。请注意,在版本范围中使用逗号需要将其括在双引号中。 例如:
Import-Package: com.acme.foo;version="[1.23, 2)", com.acme.bar;version="[4.0, 5.0)"
在下表中,对于左侧列中的每个指定范围,如果右侧列中的谓词为true,则认为版本x是该范围的成员。
[1.2.3, 4.5.6) | 1.2.3 <= x < 4.5.6 [1.2.3, 4.5.6] | 1.2.3 <= x <= 4.5.6 (1.2.3, 4.5.6) | 1.2.3 < x < 4.5.6 (1.2.3, 4.5.6] | 1.2.3 < x <= 4.5.6 1.2.3 | 1.2.3 <= x
1)versionRange = 1.4.0相当于[1.4.0,无穷大]
2)我说它无效,因为地板应低于天花板。
3)我相信下一个OSGi规范将定义一个VersionRange类。
请参阅http://www.osgi.org/Download/File?url=/download/osgi-early-draft-2011-09.pdf中的 RFC 175。 它定义了版本定义的更新,还引入了VersionRange类。
版本范围可以为空,例如第二个项目符号中的示例。 空版本范围不包含任何版本。