Eclipse OSGI不处理MANIFEST中的提供者选择

时间:2018-08-03 12:51:05

标签: java eclipse maven osgi

我有一些Maven工件不在我的控制下,需要在Plugin项目中使用。 这些Maven工件通过org.reficio:p2-maven-plugin

与felix-bnd一起打包到OSGI捆绑包中

我有很多这样的工件,它们在某种程度上是相互依赖的。现在我有了两个工件A和B。在事情的专家方面,B依赖于A并将其包含在工件中,该工件用作生成OSGi-Bundle的基础。

A导出(并实际上包含)包a.foo。 B依赖于A,将jar打包到工件中,并且Bundle-Generation也错误地将B标记为导出a.foo

因此,到目前为止,我有以下两个MANIFEST.MF文件,它们不在我的控制下:

A / MANIFEST.MF

Bundle-Symbolic-Name: com.acme.A
Bundle-Version: 2.0.0.[...]
Export-Package: a.foo

B / MANIFEST.MF

Bundle-Symbolic-Name: com.acme.B
Bundle-Version: 2.0.0.[...]
Export-Package: a.foo,
 b, b.bar, [...]

我非常有信心,如果B要Import-Package: a.foo并用uses="com.acme.A"声明导出,该问题就不会出现。如果B根本不会正确导出a.foo,则该问题也不会出现。

所以我有一个捆绑包,它取决于A和B的东西。清单看起来像这样:

Bundle-Symbolic-Name: org.foo.product
Bundle-Version: 2.0.0
Import-Package: a.foo,
 b, b.foo, [...]

这意味着我的目标平台中同时具有捆绑软件A和B。现在,当我检查a.foo的日食“目标平台状态”窗口时,可以看到日食认为它是由 B 提供的。使用a.foo中的类会导致编译错误:

  

访问限制:类型'ModuleException'不是API(对所需库'[..] / com.acme.A_2.0.0.jar'的限制

由于无法满足导入a.foo,因此忽略编译错误并执行bundle会导致BundleException。

要对此进行补救,我尝试通过将Import-Package语句更改为以下内容来确定A作为a.foo的提供者:

a.foo;
  bundle-symbolic-name="com.acme.A";
  bundle-version="[2.0.0,3)",

根据OSGI 7.0 Specification 3.7.10,这是一个非常好的规范。

这确实将编译错误更改为明确缺少的要求。 Eclipse在施加限制的情况下无法找到软件包a.foo。它还无法修复运行时错误。
Eclipse建议使用一种快速修复程序,为Import-Package添加一个a.foo语句。 当我让Eclipse这样做时,它只会删除提供程序匹配器。

当我将com.acme.A捆绑包明确放在类路径上时(如@howlger所建议),编译错误就消失了。不幸的是,运行时错误未受影响。

为什么提供者选择限制不符合规范? 如何获取eclipse和OSGI以选择正确的提供程序包?

0 个答案:

没有答案