0

有人可以向我解释 BND 导出捆绑包没有的 api 包背后的基本原理吗?这对我来说似乎是错误的,它总是(AFAICT)导致ClassNotFoundException

特别是bundle
A 包含com.foo.api.MyInterface
bundle B 包含com.foo.impl.InterfaceImpl哪些实现MyInterface

因此,如果我告诉 bnd 导出包com.fooA 中的包,他将正确导出com.foo.api,但如果我告诉com.foo包 B 中的导出包,它将错误导出com.foo.api,因此MyInterface的消费者被连接到包 B,然后在运行时获得 ClassNotFoundException

为什么 BND 不保证当一个包导出一个包时它实际上包含它?

我知道如果我导出com.foo.apicom.foo.impl不是com.foo在我的简单示例中解决问题,但在我们的实际系统中,这并不是真正的可能性。此外,实际的问题是为什么 BND 会这样做,而不是如何解决问题。我已经知道解决问题的方法

4

3 回答 3

1

您是否在包 B 中查看 com.foo.api 不在其中?如果你告诉 bnd 包 B 应该导出 com.foo.api,那么 bnd 会实际将该包放入包 B 然后导出它。bnd 具有“能力”,可以在生成的包中包含来自 -buildpath 中任何位置的类。我认为您确实不希望捆绑 B 包含和导出 com.foo.api,因此您应该修改 bnd 文件以删除导出语句。

于 2014-04-30T13:19:55.120 回答
1

这只是 bnd 语法的一个特性。因为 bnd 可以选择嵌入导入的包,所以它在确定 Export-Package 和 Private-Package 标头时会考虑整个类路径。Bnd 不区分物理上位于正在处理的文件夹的本地类和类路径上其他位置的其他类。

因此,如果您的 Export-Package 语句包含 bnd 知道的包,bnd 将假定您要嵌入和导出它们。不过,我很惊讶您会看到异常,因为 bnd 还应该将导出的类物理地包含在打包的包中。

于 2014-04-30T07:53:55.407 回答
0

我还没有直接使用 bnd,而是通过应该非常相似的 maven bundle 插件使用。我发现如果你导出一个你没有的包,那么 bnd 将把这个包的类嵌入到你的包 jar 中。

因此,至少在使用 maven bundle 插件时,bundle B 应该在定义 com.foo.api 的导出时嵌入接口。不确定当您仅​​将父包定义为导出时会发生什么,但我会假设会发生同样的情况。

如果您想将 api 与我不经常这样做但似乎是 OSGi 中的一种最佳实践(例如对于实现 OSGi api 的包)一起部署,这种自动嵌入可能非常有用。

于 2014-04-29T16:02:35.217 回答