Java Eclipse OSGI不处理清单中的提供者选择

Java Eclipse OSGI不处理清单中的提供者选择,java,eclipse,maven,osgi,Java,Eclipse,Maven,Osgi,我有一些maven工件不在我的控制之下,我需要在插件项目中使用它们。 这些maven工件通过felix bnd打包到OSGI包中 我有很多这样的人工制品,它们在一定程度上是相互依存的。现在我有两个工件A和B。在maven方面,B依赖于A,并将其包含在工件中,该工件用作生成OSGi包的基础 A导出(并实际包含)包A.foo。B依赖于A,将jar打包到工件中,包生成也错误地将B标记为导出A.foo 因此,到目前为止,我有以下两个MANIFEST.MF文件,它们不在我的控制之下: A/MANIFEST

我有一些maven工件不在我的控制之下,我需要在插件项目中使用它们。 这些maven工件通过felix bnd打包到OSGI包中

我有很多这样的人工制品,它们在一定程度上是相互依存的。现在我有两个工件A和B。在maven方面,B依赖于A,并将其包含在工件中,该工件用作生成OSGi包的基础

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

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

A/MANIFEST.MF

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

Bundle-Symbolic-Name: com.acme.A
Bundle-Version: 2.0.0.[...]
Export-Package: a.foo
Bundle-Symbolic-Name: com.acme.B
Bundle-Version: 2.0.0.[...]
Export-Package: a.foo,
 b, b.bar, [...]
如果B导入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
检查eclipse的“目标平台状态”窗口时,我可以看到eclipse认为它是由B提供的。使用
a.foo
中的类会导致编译错误:

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

忽略该编译错误并执行捆绑会导致BundleException,因为无法满足导入
a.foo

为了纠正这一点,我尝试通过将Import-Package语句更改为:

a.foo;
  bundle-symbolic-name="com.acme.A";
  bundle-version="[2.0.0,3)",
根据标准,这是一个完美的规范

这确实会将编译错误更改为显式的缺少需求。Eclipse无法在受到限制的情况下找到包
a.foo
。它也不会修复运行时错误。
Eclipse建议使用快速修复程序为
a.foo
添加
导入包
语句。 当我让eclipse这样做时,它只会删除提供程序匹配器

当我显式地将
com.acme.A
包放在类路径上时(正如@howlger所建议的),编译错误消失了。遗憾的是,运行时错误没有受到影响

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

我在eclipse Photon(4.8.0)中使用一个简单的Hello World OSGI应用程序尝试了提供程序选择它可以按预期工作:
Import-Package:org.osgi.framework;bundle-symbolic-name=org.eclipse.osgi
编译并可以执行,
Import-Package:org.osgi.framework;bundle-symbolic-name=non.existing
给出了导入org.osgi无法按预期解决的错误。还有版本约束和bundle-symbolic-nam我无法复制这个问题。