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

时间:2020-03-05 18:58:25  来源:igfitidea点击:

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

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

解决方案

回答

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

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

回答

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

回答

如果我们只是"需要"一个组件是可插入的,那么只需根据元信息实例化这些类就足够了,例如,通过类加载器读取META-INF /信息,该信息来自类路径或者某个插件目录中的各种jar。

另一方面,OSGi提供了构建整个应用程序的方法。如果我们已经有一个大型的桌面应用程序,并且需要一个可插接的部件,那么这将是一个艰难的学习过程。如果我们将要使用的桌面应用程序一开始就空白,则OSGi提供了将整个应用程序模块化的方法。这是关于"组件隔离"和模块的独立性。

如果我们想走OSGi路线,则Apache Felix是一个不错的开始。它看起来可能很复杂且重量级,但这仅是因为不习惯在模块之间使用这种级别的隔离。曾经很容易调用任何公共方法...

回答

OSGI当然是有效的方法。但是,假设我们不需要卸载即可重新加载插件,则可能是使用锤子将螺母开裂了。

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

回答

在尝试了基于插件的Java体系结构(我们似乎在寻找的正是)之后,我终于发现JSPF是Java5代码的最佳解决方案。它不像解决方案那样具有OSGI的巨大需求,但是相当易于使用。