我想为一个非常通用的应用程序创建一个插件扩展机制,它有很多方面和许多不同的功能。
关于我开发的更多细节:
- 我有一个 GUI 应用程序,想提供很多扩展点。我想添加菜单、操作、工具栏按钮等。
- 我有一些非 GUI 服务,它们监视编辑数据的更改等。我想注册这些服务。
我正在考虑 Equinox(例如,由于应用程序的限制,我不能使用它)及其涉及扩展和扩展点的非常好的可扩展性机制。这种方法有什么问题?有什么替代解决方案可以解决这个问题?
我想为一个非常通用的应用程序创建一个插件扩展机制,它有很多方面和许多不同的功能。
关于我开发的更多细节:
我正在考虑 Equinox(例如,由于应用程序的限制,我不能使用它)及其涉及扩展和扩展点的非常好的可扩展性机制。这种方法有什么问题?有什么替代解决方案可以解决这个问题?
你写什么样的应用程序?扩展和扩展点的eclipse机制是eclipse rcp的专有概念。因此,如果您编写一个 Eclipse rcp gui,那么这就是要走的路。
如果您编写服务器应用程序,那么 OSGi 服务更合适。对于服务器应用程序,我建议使用Apache Karaf而不是 Equinox。Karaf 可以将 Equinox 作为 OSGi 框架运行,但它还提供许多附加功能,例如从 maven repos 部署和日志支持。这是一个关于如何使用 OSGi 和 Apache Karaf 编写简单服务器应用程序的小教程。它展示了如何使用 OSGi 服务来解耦 api 和实现。
为了可扩展性,您可能希望使用一个 API 和多个服务实现。这也是可能的。您可以获取接口的服务列表,还可以通知添加和删除的服务。
对于 UI 可扩展性,eclipse RCP 肯定会在该领域提供很多功能。
对于较低层,听起来您正在查看 OSGi,其中 Equinox 只是许多可能的运行时环境之一。如果您坚持按照规范进行编码,那么您可以为您的应用程序使用 Equinox、Felix ... 或任何其他实现。
当您谈论可扩展性时,您还没有真正定义您正在寻找什么,并且对于这样一个开放式问题,您正在提出它是封闭的。
使用 OGSi 时需要注意的一个问题是,它为每个包(=模块)使用类加载器来将包相互隔离。这通常很痛苦,尤其是在使用并非设计用于 OSGi 环境的库时。最后,几乎所有由此产生的类加载问题都可以解决,但解决问题可能非常耗时。
您还可以使用 spring 使您的程序模块化和可扩展。Spring 的应用程序上下文可以嵌套,因此“模块”可以使用其父级的 spring bean,反之则不行。可以告诉 Spring 自动发现类路径上所有 jar 的应用程序上下文文件。要使用这种方法对 Eclipse 扩展点进行建模,一个模块可以提供一个具有“注册”方法的 bean,其他模块可以使用该方法来挂钩。
使用来自另一个模块的服务就像在 spring 中获取对服务 bean 的引用一样简单(假设相应地设置了应用程序上下文层次结构)。