我有一些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以选择正确的提供程序包?