Maven OSGi捆绑

时间:2014-11-07 07:51:08

标签: java osgi

我正在使用maven felix插件来创建OSGi包,但是假设你有一个包" com.example"存在于project1和project2中。另外,project2依赖于project1。

如果在project2中导出包,它将具有来自project1的project2 的代码。这对我来说真是奇怪的行为。我能想到他们启用这种行为的唯一原因是因为OSGi以某种方式需要它吗? (我已经查看了http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html,但似乎无法找到关闭它的方法)

如果两个罐子(A和B)导出相同的包但其中有不同的类,而第三个罐子(C)依赖于该包,我会假设C可以同时看到A& B在运行时。或者OSGi每个罐子需要不同的包装吗?

如果OSGi没有强制要求,我该如何转变这个"功能"关闭?

如果OSGi 强制要求,那么......为什么?

更新

Christian提供的答案清除了OSGi对不同罐子中不同包装的要求。但是我仍然遇到了felix的问题,我有一个" api" jar包含:

  • com.example.api:实际接口
  • com.example:工厂类,实用工具类......

并且实施包具有:

  • com.example.impl

现在,当我使用felix构建实现包并导出" com.example.impl"时,它确实会包含" com.example.impl"但由于某种原因,它还包括" com.example"中的所有类。 (不是.api中的那些)。我尝试过的任何设置组合都不会阻止felix添加" base"包装出于某种原因...

所以基本上是在" impl"我实际上有一个com.example.MyFactory类,它位于api包中。我怎么能阻止这个?

1 个答案:

答案 0 :(得分:2)

OSGi并未强制要求您在两个项目中拥有相同的包。实际上,您应该避免在具有不同内容的两个包中使用相同的包/版本组合。

在OSGi中,当捆绑从安装到解决时,会发生接线。在该步骤中,框架将每个Import-Package语句与一个与名称和版本范围匹配的导出包匹配。在OSGi中,即使多个包导出相同的包,也只会将一个包连接到每个包。这与标准java不同,在标准java中,您将混合使用包含可能具有非常不可预测结果的包的所有jar类。

在OSGi中,有一种模式,您可以在多个包中使用相同的包。它被用于OSGi的官方API很多。在实现API时,您还包含API包,并具有Import-Package以及API包的Export-Package语句。这允许安装实现包而无需额外的API包。即使有多个包含API的bundle也可以正常工作,因为框架将选择一个API包并将所有其他包连接到同一个包。所以他们都看到同一组课程并没有冲突。

您也可以为自己的应用程序执行此操作,但更常见的是将API包放在一个包中,而其他所有包都只是导入它。

您可以在apache felix OSGi Frequently Asked Questions

找到一些信息

回答您的最新问题。我猜你只导出com.example.api包。所以maven bundle插件知道它可以使用Import-Package语句引用这个包。由于com.example未导出,插件知道Import-Package不起作用。所以它嵌入了类。

所以你应该带走的是你需要导出其他包所需的所有包。顺便说一句。您通常不会在OSGi中导出impl包。而是隐藏服务背后的impl。服务接口位于API中。然后,impl bundle实现接口并将impl导出为OSGi服务。因此,其他捆绑包可以通过其接口绑定服务,整个impl可以保持私密。