5

我正在编写一个 J2SE 桌面应用程序,它需要它的一个组件是可插入的。我已经为这个插件定义了 Java 接口。用户应该能够在运行时(通过 GUI)选择他们想要使用该接口的哪个实现(例如在初始化对话框中)。我设想每个插件都被打包为一个 JAR 文件,其中包含实现类以及它可能需要的任何辅助类。

在桌面 Java 应用程序中做这类事情的最佳技术是什么?

4

5 回答 5

5

在多次尝试基于插件的 Java 架构(这正是您所寻找的)之后,我终于发现JSPF是 Java5 代码的最佳解决方案。它没有像 OSGI 这样的解决方案的巨大需求,而是相当容易使用。

于 2008-09-17T11:17:13.770 回答
2

OSGI 无疑是一种有效的方法。但是,假设您不需要卸载来重新加载插件,它可能是用锤子敲碎螺母。

您可以使用“java.util.jar”中的类来扫描插件文件夹中的每个 JAR 文件,然后使用“java.net.URLClassLoader”加载正确的文件。

于 2008-09-17T09:49:22.593 回答
1

如果您“只”需要一个可插入的组件,则只需根据元信息实例化类就足够了,例如通过类加载器从类路径或某个插件目录中的各种 jar 中读取 META-INF/ 信息.

另一方面,OSGi 提供了构建整个应用程序的方法。如果您已经有一个大型桌面应用程序需要一个部件可插拔,这将是一个陡峭的学习曲线。如果您对桌面应用程序一无所知,OSGi 提供了模块化整个应用程序的方法。它是关于“组件的隔离”和模块的独立性。

如果您想进入 OSGi 通道,Apache Felix 提供了一个很好的开始。它可能看起来复杂而重量级,但这只是因为人们不习惯模块之间的那种隔离级别。过去调用任何公共方法都很容易......

于 2008-09-17T09:44:38.843 回答
0

我正在考虑的一种方法是让我的应用程序启动一个轻量级 OSGi 容器,如果我理解正确,它将能够发现指定文件夹中存在哪些插件 JAR 文件,这反过来又可以让我列出它们供用户选择从。这可行吗?

我还发现了 Richard Deadman 的这篇文章,但它看起来有点过时(2006 年?)并且既没有提到 OSGi(至少没有提到名字)也没有提到java.util.jar

于 2008-09-17T09:38:11.357 回答
0

您是否想过使用 OSGi 作为插件框架?使用 OSGi,您可以按需更新/替换、加载或卸载您的模块。

于 2008-09-17T09:38:50.853 回答