在开发基于模块或者插件的系统时应该如何开始?
我打算开发一个完全基于模块的系统。系统库应支持查找插件,启动插件并能够为这些模块提供通信方式。理想情况下,一个人应该能够放入新模块并随意删除未使用的模块,并且如果有的话,模块应该能够使用彼此的功能。
该系统应被用作模拟系统的基础,在该模拟系统中,许多事情发生在不同的模块中,而其他模块可能希望以此为基础进行某些操作。
我打算开发的系统将使用Java。按照我的观察方式,我打算为每个模块创建一个带有子文件夹的文件夹,该文件夹包含一个XML,该XML用诸如名称,可能引发的事件之类的信息描述模块。我想我可能需要编写一个自定义的ClassLoader来解决这些问题。
问题是,我不知道我的想法是否真正成立,当然,我打算构建一个可行的原型。但是,我以前从未在真正的模块化系统上工作过,并且我不确定如何解决此问题的最佳方法。
我应该从哪里开始?开发这种系统时是否存在常见的问题和陷阱?如何在保持隔离的同时使各个模块相互通信(即,我们卸下一个模块,而另一个正在使用该模块的模块保持理智)?我是否可以阅读任何指南,规格或者文章,这些可以给我一些从何入手的想法?如果它们基于Java,那会更好,但这不是必须的,因为我现在正在寻找的是想法,而不是代码。
任何反馈表示赞赏。
解决方案
回答
在不深入讨论的情况下,我们应该研究Spring,并且熟悉OSGI或者Eclipse RCP框架还将为我们提供一些需要牢记的基本概念。
回答
他们有很多方法可以做到,但是可以通过使用Reflection实现一些简单的操作。我们在文件中输入XML文件名(实际上是一个类)。然后,我们可以检查它是什么类型,然后使用反射将其创建回去。该类可以具有一个公共接口,该接口可以让我们查找外部文件/类是否确实是模块之一。这是有关反射的一些信息。
我们还可以使用诸如SourceForge onelink文本之类的预编码框架,这将为我们提供创建模块/插件的第一步。
回答
我们绝对应该看一下OSGi。它旨在成为Java的组件/插件机制。它使我们可以将代码模块化(称为捆绑包)并在运行时更新捆绑包。我们还可以完全隐藏其他软件包的实现包,以防止它们受到其他软件包的意外访问。仅提供API。
Eclipse是实现和使用OSGi的第一个主要的开源项目,但是他们没有充分利用它(没有重新启动就没有插件安装/更新)。但是,如果我们从头开始,它将为我们提供一个非常好的插件系统框架。
Apache Felix是一个完整的开源实现(还有其他一些实现,例如Eclipse Equinox)。
回答
另一个选项是Java 1.6中添加的ServiceLoader。