2011-12-02 60 views
7

目前我正在尝试实现OSGI版本范围(针对不同的主题,但我喜欢他们定义版本范围的方式)。不过,我很难在OSGI中找到版本范围的特定定义。OSGI有效版本范围

不幸的是,OSGI API确实包含一个版本类,但不是VersionRange类。似乎所有的OSGI容器都提出了他们自己对版本范围定义的解释。

所以我有几个问题:

  • 如果我用versionRange=1.4.0,将这个地图版本> = 1.4.0?
  • 这是一个有效的版本范围:versionRange=[1.0.0,0]:我想说的是(1.0.0版本升级到任何版本),Eclipse的实施接受它作为一个版本,但无法正确处理它。
    • 这将是一个有效的versionRange藏汉:versionRange=[1.0.0,0)
  • 真理在哪里对所有这些问题的实际来源?我似乎无法找到它。

回答

6

版范围恰恰在OSGi核心规范的3.2.6节所定义。您当前的API中没有VersionRange类是正确的,尽管在下一个规范版本中会有。

OSGi框架实现做不是拿出他们自己的范围解释;如果您发现特定框架解释的范围与Core Spec 3.2.6节不同,那么请提出针对该框架的错误。

为了解决您的具体问题:

  • 是,version=1.4.0Import-Package(或在Require-Bundlebundle-version=1.4.0)不图非正式地 “版本> = 1.4.0”。

  • 我相信,这两个版本的范围是有效的,但他们绝不会匹配任何版本。例如。第一个例子将仅匹配版本x,其中x >= 1.0.0x<=0。没有价值的x可以满足这两个要求。所以这听起来像Eclipse的行为是正确的......它应该成功解析范围字符串,但永远不会返回任何结果。

  • 如前所述,如果您正在阅读文档的R4.3版本,“真相源代码”是OSGi Core Specification的第3.2.6节....第29页。

1

1)versionRange = 1.4.0等于[1.4.0,无穷大)

2)我会说这是无效的,因为地板应该比天花板下。

3)我相信下一个OSGi规范将定义一个VersionRange类。

4

因此,要回答你的具体问题依次是:

  • 如果我用versionRange = 1.4.0,将这个地图版本> = 1.4.0?

是。这正是规格说明它应该被解释的方式(见下文)。

  • 这是一个有效的版本范围:versionRange = [1.0.0,0]

是的,这是一个有效的范围内,但它不会计算为你似乎什么期待。 它有效地评估为一组空的版本,所以没有版本会匹配这个表达式。

  • 这将是一个有效的versionRange藏汉:versionRange = [1.0.0,0)?

同上 - 它是一个有效的版本范围,但它将评估为空集。

  • 真理在哪里对所有这些问题的实际来源?我似乎无法找到它

的规格可从OSGi Alliance's主页: 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)" 

在下面的表中,在左侧列中的每个指定的范围内,一个版本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