OSGi项目的结构

时间:2015-04-21 21:44:11

标签: java osgi modular

我想开发一个系统来管理文本文件的读数。主要结构基于4个捆绑包:

  • 一个为timestamp
  • 提供log
  • 生成/提供数据
  • 一个保留log(将timestamp和值添加到文件中)
  • 使用timestamp和读数
  • 可视化生成的文件

我的问题是:每个bundle应如何组织?我不是100%熟悉OSGi工作方式,而是我正在做的事情。我目前的结构如下:

enter image description here

  • *接口文件是我提供服务的地方
  • * Activator文件是bundle activator s,我在其中注册service s
  • * Impl文件用于实现interfaces,虽然我不确定我是否应该在同一个包中实现

这是对的吗?提前谢谢。

2 个答案:

答案 0 :(得分:0)

您可以将接口分离到不同的包中。通常,您希望每个包都导出包含接口的包,但不包括实现包。这将有助于最小化束之间的耦合。

看起来您在一个项目中拥有所有服务,这将导致它们都在同一个OSGi包中。您应该使用自己的清单文件将每个项目分离到自己的项目中。这样,服务可以独立开发和部署,并通过服务接口进行通信。

答案 1 :(得分:0)

有几点想法。首先将代码组织到包中,然后捆绑第二个。假设您是基于包而不是bundle来表示依赖关系,那么以后拆分包相对容易。

其次,捆绑您的预期用途并重复使用。这是同一个单元的一部分吗?如果是这样,我有一个API包和一个或多个实现包。如果您希望人们稍后混合搭配(例如,将数据文件界面与时间界面分开使用),则那些(可能)属于单独的捆绑包。

我看到了一些叫做“激活者”的不同事物。激活器管理捆绑包的生命周期(启动,关闭等)。我通常每捆创建一个激活剂,并将其置于“内部”中。包裹以澄清它不应该逃脱。

最后,请记住库代码和应用程​​序代码之间的区别。如果你想在不同的应用程序中重用一个bundle(有点重要),它可能不应该启动自己的服务(通过激活器或声明性服务)。在应用程序(了解和利用OSGi以组装产品的事物)和库之间保持清晰的区别,允许您稍后在OSGi上下文之外重用代码。