我想为一个非常通用的应用程序创建一个插件可扩展性机制,它具有许多方面和许多不同的功能。
关于我的发展的更多细节:
我正在考虑Equinox(作为一个例子,由于应用程序的限制,我不能使用它)及其非常好的可扩展性机制,涉及扩展和扩展点。这种方法有什么问题?有哪些替代方案可以解决这个问题?
答案 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的引用一样简单(假设相应地设置了应用程序上下文层次结构)。