1

我有包 A、B 和 C。A 包含一个包“a”,它分别由包 B 和 C 中的包 b 和 c 中的代码依赖。

bundle A {
  package a

  export-package:a
}

bundle B {
  package b.a
  package b.b
  package b.c
  package b.d
  package b.e

  import-package: a
  export-package:b.a;uses:=a,
    b.b;uses:=b.a,
    b.c;uses:=b.b,
    b.d;uses:=b.c,
    b.e;uses:=b.d
}

bundle C {
  package c

  import-package: b.e,
    a
}

当我一起更新所有这些包时,我经常会遇到使用约束违规(Felix 报告风格):

Chain 1:
  C [47.1]
    import: (&(osgi.wiring.package=a)(version>=1.1.0))
     |
    export: osgi.wiring.package=a
  A [9.1]

Chain 2:
  C [47.1]
    import: (&(osgi.wiring.package=b.e)(version>=1.0.0))
     |
    export: osgi.wiring.package=b.e; uses:=a
  B [33.0]
    import: (&(osgi.wiring.package=a)(version>=1.0.0))
     |
    export: osgi.wiring.package=a
  C [9.0]

最初我很惊讶会为“a”生成一个使用子句。这未在 Manifest 或提供这些捆绑包的 OBR repository.xml 中声明。但是,类型是通过它们的 API 公开类型的,所以我想这就是它的来源。

我发现解决这些问题的唯一方法是增加中间包的导出和导入的版本号,例如在这个例子中。但是,有很多包最终使用“a”,可传递。

这意味着每次更新 'a' 时,我还需要使用新版本更新 a 上的所有传递依赖项。增加这些软件包的版本号是否正确?重构我的代码以减少相互依赖是唯一的另一种方式吗?

4

1 回答 1

3

使用约束不被解析器传递处理。

如果 bundle C 导入 be 和 be 使用 bd,那么 bundle C 也需要导入 bd 即 be 的公共签名包含对 bd 中某物的引用 这就是为什么我们说 be 使用 bd 因此,任何导入 be 的 bundle 也必须import bd 否则,bundle 无法正确使用 be,因为 be 中引用的某些类型对 bundle 不可见。

对于 be 的导出,它应该说明它使用 bd、bc、bb、ba 和 a,因为使用 bd 意味着你也使用 bc 等等......

您是否手动生成了您的使用条款?或者这个例子是从 bnd 生成的东西衍生而来的?

于 2012-07-24T20:14:40.993 回答