管理通过使用约束声明的传递包依赖项

时间:2012-07-24 18:09:46

标签: osgi apache-felix

我有捆绑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]

我最初感到惊讶的是,b.e为'a'生成了一个使用条款。这不是在Manifest中声明的,也不是通过其配置这些bundle的OBR repository.xml。但是,b.e中的类型通过它们的API公开类型,所以我想这就是它的来源。

我找到解决这些问题的唯一方法是增加中间包的导出和导入的版本号,例如: b.e在这个例子中。但是,有很多软件包最终使用'a',传递。

这意味着每次我更新'a'时我都需要更新新版本的所有传递依赖项。增加这些软件包的版本号是否正确?重构我的代码是否与其他唯一方式相互依赖?

1 个答案:

答案 0 :(得分:3)

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

如果bundle C导入b.e并且b.e使用了b.d,那么bundle C也需要导入b.d.也就是说,b.e的公共签名包括对b.d中某些内容的引用。这就是为什么我们说b.e使用b.d.因此,任何导入b.e的bundle也必须导入b.d.否则,bundle无法正确使用b.e,因为b.e中引用的某些类型对bundle不可见。

对于b.e的导出,它应该声明它使用b.d,b.c,b.b,b.a和a,因为使用b.d意味着你也使用b.c等等......

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