7

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

该系统应该用作模拟系统的基础,其中很多事情发生在不同的模块中,而其他模块可能希望在此基础上做一些事情。

我打算开发的系统将使用 Java。在我看来,我打算为每个模块创建一个包含子文件夹的文件夹,其中包含一个 XML 描述模块的信息,例如名称、可能引发的事件等。我想我可能需要编写一个自定义 ClassLoader 来解决这些问题。

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

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

任何反馈表示赞赏。

4

4 回答 4

10

You should definitely look at OSGi. It aims at being the component/plugin mechanism for Java. It allows you to modularize your code (in so-called bundles) and update bundles at runtime. You can also completely hide implementation packages from unwanted access by other bundles, eg. only provide the API.

Eclipse was the first major open-source project to implement and use OSGi, but they didn't fully leverage it (no plugin installations/updates without restarts). If you start from scratch though, it will give you a very good framework for a plugin system.

Apache Felix is a complete open-source implementation (and there are others, such as Eclipse Equinox).

于 2008-09-16T22:42:44.037 回答
2

在不深入细节的情况下,您应该了解一下Spring,并且熟悉 OSGI 或 Eclipse RCP 框架也会为您提供一些需要牢记的基本概念。

于 2008-09-16T22:39:27.540 回答
2

Another option is the ServiceLoader added in Java 1.6.

于 2008-09-16T23:12:46.803 回答
1

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

您还可以使用像这样的预编码框架 SourceForge 一个链接文本,它将为您提供创建模块/插件的第一步。

于 2008-09-16T22:40:39.860 回答