我正在编写一个 J2SE 桌面应用程序,它需要它的一个组件是可插入的。我已经为这个插件定义了 Java 接口。用户应该能够在运行时(通过 GUI)选择他们想要使用该接口的哪个实现(例如在初始化对话框中)。我设想每个插件都被打包为一个 JAR 文件,其中包含实现类以及它可能需要的任何辅助类。
在桌面 Java 应用程序中做这类事情的最佳技术是什么?
我正在编写一个 J2SE 桌面应用程序,它需要它的一个组件是可插入的。我已经为这个插件定义了 Java 接口。用户应该能够在运行时(通过 GUI)选择他们想要使用该接口的哪个实现(例如在初始化对话框中)。我设想每个插件都被打包为一个 JAR 文件,其中包含实现类以及它可能需要的任何辅助类。
在桌面 Java 应用程序中做这类事情的最佳技术是什么?
在多次尝试基于插件的 Java 架构(这正是您所寻找的)之后,我终于发现JSPF是 Java5 代码的最佳解决方案。它没有像 OSGI 这样的解决方案的巨大需求,而是相当容易使用。
OSGI 无疑是一种有效的方法。但是,假设您不需要卸载来重新加载插件,它可能是用锤子敲碎螺母。
您可以使用“java.util.jar”中的类来扫描插件文件夹中的每个 JAR 文件,然后使用“java.net.URLClassLoader”加载正确的文件。
如果您“只”需要一个可插入的组件,则只需根据元信息实例化类就足够了,例如通过类加载器从类路径或某个插件目录中的各种 jar 中读取 META-INF/ 信息.
另一方面,OSGi 提供了构建整个应用程序的方法。如果您已经有一个大型桌面应用程序需要一个部件可插拔,这将是一个陡峭的学习曲线。如果您对桌面应用程序一无所知,OSGi 提供了模块化整个应用程序的方法。它是关于“组件的隔离”和模块的独立性。
如果您想进入 OSGi 通道,Apache Felix 提供了一个很好的开始。它可能看起来复杂而重量级,但这只是因为人们不习惯模块之间的那种隔离级别。过去调用任何公共方法都很容易......
我正在考虑的一种方法是让我的应用程序启动一个轻量级 OSGi 容器,如果我理解正确,它将能够发现指定文件夹中存在哪些插件 JAR 文件,这反过来又可以让我列出它们供用户选择从。这可行吗?
我还发现了 Richard Deadman 的这篇文章,但它看起来有点过时(2006 年?)并且既没有提到 OSGi(至少没有提到名字)也没有提到java.util.jar
包
您是否想过使用 OSGi 作为插件框架?使用 OSGi,您可以按需更新/替换、加载或卸载您的模块。