我打算开发一个完全基于模块的系统。系统基础应该支持查找插件、启动它们并能够为这些模块提供通信方式。理想情况下,人们应该能够随意放入新模块并删除未使用的模块,并且模块应该能够使用彼此的功能(如果可用)。

该系统应该用作模拟系统的基础,其中很多事情发生在不同的模块中,并且其他模块可能想要基于该系统做一些事情。

我打算开发的系统将采用 Java 语言。在我看来,我打算为每个模块建立一个带有子文件夹的文件夹,其中包含一个 XML,该 XML 描述了模块的信息,例如名称、可能会引发哪些事件等。我想我可能需要编写一个自定义类加载器来解决这个问题。

问题是,我不知道我的想法是否真的站得住脚,当然,我打算构建一个工作原型。然而,我以前从未研究过真正的模块化系统,而且我不太确定解决这个问题的最佳方法是什么。

我应该从哪里开始?在开发此类系统时是否发现了常见的问题和陷阱?如何使模块相互通信,同时保持隔离(即,删除一个模块,而使用它的另一个模块保持正常)?是否有任何我可以阅读的指南、规范或文章可以为我提供一些关于从哪里开始的想法?如果它们基于 Java 会更好,但这不是必需的,因为我现在正在寻找的是想法,而不是代码。

如有任何反馈,我们将不胜感激。

有帮助吗?

解决方案

你绝对应该看看 操作系统Gi. 。它的目的是成为 Java 的组件/插件机制。它允许您模块化代码(在所谓的捆绑包中)并在运行时更新捆绑包。您还可以完全隐藏实现包,防止其他包进行不必要的访问,例如。只提供API。

Eclipse 是第一个实现和使用 OSGi 的主要开源项目,但他们没有充分利用它(无需重新启动即可安装/更新插件)。如果您从头开始,它将为您提供一个非常好的插件系统框架。

阿帕奇菲利克斯 是一个完整的开源实现(还有其他的,例如 日食春分).

其他提示

在不深入细节的情况下,您应该看看 春天 熟悉 OSGI 或 Eclipse RCP 框架还将为您提供一些需要牢记的基本概念。

另一种选择是 服务加载器 Java 1.6 中添加。

有很多方法可以做到这一点,但使用反射可以实现一些简单的方法。您写入文件的 XML 文件名(实际上是一个类)。然后您可以检查它是什么类型并通过反射将其创建回来。该类可以有一个通用接口,让您可以查找外部文件/类是否确实是您的模块之一。这是一些有关的信息 反射.

您还可以使用像 SourceForge 这样的预编码框架链接文本 这将为您创建模块/插件迈出良好的第一步。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top