【问题标题】:OSGI Valid Version RangesOSGI 有效版本范围
【发布时间】:2012-01-11 07:57:20
【问题描述】:

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

不幸的是,OSGI API 确实包含 Version 类但不包含 VersionRange 类。似乎所有 OSGI 容器都对(有点找不到的)版本范围定义提出了自己的解释。

因此我有几个问题:

  • 如果我使用versionRange=1.4.0,是否会映射到版本>= 1.4.0?
  • 这是一个有效的版本范围:versionRange=[1.0.0,0]:我会说是(版本 1.0.0 到任何版本),Eclipse 实现接受它作为一个版本,但不能正确处理它。
    • 这是否也是一个有效的版本范围:versionRange=[1.0.0,0)
  • 所有这些问题的真实来源在哪里?我似乎无法找到它。

【问题讨论】:

    标签: java osgi


    【解决方案1】:

    1) versionRange=1.4.0 等价于 [1.4.0, infinity)

    2) 我会说它是无效的,因为地板应该低于天花板。

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

    【讨论】:

      【解决方案2】:

      版本范围在 OSGi 核心规范的第 3.2.6 节中精确定义。您说得对,当前 API 中没有 VersionRange 类,尽管在下一个规范版本中会有。

      OSGi 框架实现提出自己的范围解释;如果您发现特定框架对范围的解释与核心规范第 3.2.6 节不同,请针对该框架提出错误。

      解决您的具体问题:

      • 是的,Import-Package 上的version=1.4.0(或Require-Bundle 上的bundle-version=1.4.0)确实非正式地映射到“版本> = 1.4.0”。

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

      • 如前所述,“事实来源”是 OSGi 核心规范的第 3.2.6 节......第 29 页,如果您正在阅读该文档的 R4.3 版本。

      【讨论】:

        【解决方案3】:

        请参阅http://www.osgi.org/Download/File?url=/download/osgi-early-draft-2011-09.pdf 中的 RFC 175。它定义了对版本定义的更新,还引入了一个 VersionRange 类。

        版本范围可以为空,例如您在第二个项目符号中的示例。空版本范围不包括任何版本。

        【讨论】:

          【解决方案4】:

          所以,按顺序回答您的具体问题:

          • 如果我使用 versionRange=1.4.0,是否会映射到 Version >= 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
          

          【讨论】:

          猜你喜欢
          • 2015-07-14
          • 2021-11-20
          • 2013-11-15
          • 2015-08-13
          • 2016-04-21
          • 1970-01-01
          • 2018-09-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多