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