使用哪种插件架构

时间:2012-11-10 21:26:25

标签: plugins architecture osgi equinox extensibility

我想为一个非常通用的应用程序创建一个插件可扩展性机制,它具有许多方面和许多不同的功能。

关于我的发展的更多细节:

  • 我有一个GUI应用程序,想要提供很多扩展点。我想添加菜单,动作,工具栏按钮等。
  • 我有一些非GUI服务,它监视对已编辑数据的更改等。我想注册这些服务。

我正在考虑Equinox(作为一个例子,由于应用程序的限制,我不能使用它)及其非常好的可扩展性机制,涉及扩展和扩展点。这种方法有什么问题?有哪些替代方案可以解决这个问题?

3 个答案:

答案 0 :(得分:3)

对于UI可扩展性,eclipse RCP肯定会在该领域提供大量功能。

对于较低层,听起来就像是在看OSGi,其中Equinox只是众多可能的运行时环境之一。如果您坚持使用规范编码,那么您可以使用Equinox,Felix ......或任何其他实现来为您的应用程序。

当你谈到可扩展性时,你还没有真正定义你正在寻找的东西,而这样一个开放式问题,你正在关闭它。

答案 1 :(得分:3)

你写的是什么样的应用程序?扩展和扩展点的eclipse机制是eclipse rcp的专有概念。因此,如果你写一个eclipse rcp gui,那么这就是你要走的路。

如果您编写服务器应用程序,则OSGi服务更适合。对于服务器应用程序,我建议使用Apache Karaf而不是Equinox。 Karaf可以将Equinox作为OSGi框架运行,但它还提供了许多其他功能,例如从maven repos和日志记录支持部署。这是使用OSGi和Apache Karaf编写简单服务器应用程序的small tutorial。它展示了如何使用OSGi服务来解耦api和实现。

对于可扩展性,您可能希望使用一个API和多个服务实现。这也是可能的。您可以获取接口的服务列表,也可以获得添加和删除服务的通知。

答案 2 :(得分:1)

在寻找OGSi时要注意的一个问题是,它为每个bundle(= module)使用类加载器来将bundle彼此隔离。这通常是一种痛苦,特别是在使用未设计用于OSGi环境的库时。最后,几乎所有产生的类加载问题都可以解决,但是解决问题可能非常耗时。

您还可以使用spring来使您的程序模块化和可扩展。 Spring的应用程序上下文可以嵌套,因此“模块”可以使用它的父级的spring bean,但反之亦然。可以告诉Spring自动发现类路径上所有jar的应用程序上下文文件。要使用这种方法对eclipse扩展点进行建模,一个模块可以提供一个具有“register”方法的bean,其他模块可以使用该方法来挂接。

使用来自其他模块的服务就像在spring中获取对服务bean的引用一样简单(假设相应地设置了应用程序上下文层次结构)。