在开发基于模块或插件的系统时,我应该如何开始?
Posted
技术标签:
【中文标题】在开发基于模块或插件的系统时,我应该如何开始?【英文标题】:How should I start when developing a system based on modules or plugins? 【发布时间】:2010-09-09 19:57:08 【问题描述】:我打算开发一个完全基于模块的系统。系统基础应该支持查找插件、启动它们并能够为这些模块提供通信方式。理想情况下,应该能够随意放入新模块和抽出未使用的模块,并且模块应该能够在可用的情况下使用彼此的功能。
这个系统应该被用作模拟系统的基础,其中很多事情发生在不同的模块中,而其他模块可能想要在此基础上做一些事情。
我打算开发的系统将使用 Java。在我看来,我打算为每个模块创建一个包含一个子文件夹的文件夹,其中包含一个 XML 描述模块的信息,例如名称、可能引发的事件等。我想我可能需要编写一个自定义 ClassLoader 来解决这些问题。
问题是,我不知道我的想法是否真的站得住脚,当然,我打算建立一个工作原型。但是,我以前从未研究过真正的模块化系统,我不确定解决这个问题的最佳方法是什么。
我应该从哪里开始?开发此类系统时是否发现了常见的问题和陷阱?如何在保持隔离的同时使模块相互通信(即,您删除了一个模块,而另一个正在使用它的模块保持正常)?是否有任何我可以阅读的指南、规范或文章可以给我一些关于从哪里开始的想法?如果它们基于 Java 会更好,但这不是必需的,因为我现在正在寻找的是想法,而不是代码。
感谢任何反馈。
【问题讨论】:
【参考方案1】:你一定要看看OSGi。它旨在成为Java 的 组件/插件机制。它允许您模块化代码(在所谓的包中)并在运行时更新包。您还可以完全隐藏实现包以防止其他捆绑包的不必要访问,例如。只提供 API。
Eclipse 是第一个实现和使用 OSGi 的主要开源项目,但他们并没有充分利用它(没有插件安装/更新而不重新启动)。不过,如果您从头开始,它将为您提供一个非常好的插件系统框架。
Apache Felix 是一个完整的开源实现(还有其他的,例如Eclipse Equinox)。
【讨论】:
非常感谢您提供的指导。这是一个非常快速的答案,足以让我开始。再次感谢!【参考方案2】:在不深入细节的情况下,您应该查看Spring,并且熟悉 OSGI 或 Eclipse RCP 框架还将为您提供一些需要牢记的基本概念。
【讨论】:
【参考方案3】:另一个选项是在 Java 1.6 中添加的ServiceLoader。
【讨论】:
【参考方案4】:它们有很多方法可以做到这一点,但可以使用反射来做一些简单的事情。您在文件的 XML 文件名中写入文件(这实际上是一个类)。您可以检查它是什么类型并通过反射创建回来。该类可以有一个通用接口,可以让您找到外部文件/类是否真的是您的模块之一。以下是有关Reflexion 的一些信息。
您还可以使用像 SourceForge onelink text 这样的预编码框架,这将为您提供创建模块/插件的第一步。
【讨论】:
以上是关于在开发基于模块或插件的系统时,我应该如何开始?的主要内容,如果未能解决你的问题,请参考以下文章