为J2SE应用程序添加插件支持的最佳技术?

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

在桌面Java应用程序中执行此类操作的最佳技术是什么?

经过多次尝试基于插件的Java架构(你看起来正是这样),我终于发现JSPF是Java5代码的最佳解决方案。 它没有像解决方案那样的OSGI的巨大需求,而是相当容易使用。

OSGI当然是一种有效的方式。 但是,假设您不需要卸载来重新加载插件,它可能会使用锤子来破解螺母。

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

如果您“只是”需要一个组件可插拔,那么只需基于元信息实例化类就足够了,例如通过类路径读取META-INF /来自类路径或某个插件目录中的各种jar的信息。

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

如果你想沿着OSGi路线走下去,Apache Felix提供了一个很好的开始。 它可能看起来很复杂和重量级,但这只是因为一个模块之间没有用于那种级别的隔离。 曾经很容易调用任何公共方法……

您是否考虑过将OSGi用作插件框架? 使用OSGi,您可以根据需要更新/替换,加载或卸载模块。

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

我也发现了理查德·安德曼的这篇文章 ,但看起来有点过时(2006年?),并没有提到OSGi(至少不是名字)和java.util.jar