如何创建可插入的Java程序?

时间:2020-03-05 18:42:40  来源:igfitidea点击:

我想创建一个可以用插件扩展的Java程序。我该怎么办?我应该在哪里找?

我有一组插件必须实现的接口,它应该在jar中。该程序应在相对(相对于该程序)文件夹中监视新的jar,并以某种方式对其进行注册。

尽管我确实喜欢Eclipse RCP,但我认为这对于我的简单需求来说实在太多了。

对于Spring同样适用,但是既然我还是要研究它,我不妨尝试一下。

但是,我仍然希望找到一种方法来尽可能简单地创建自己的插件"框架"。

解决方案

回答

我们是否考虑过在Eclipse的Rich Client Platform之上构建,然后公开Eclipse扩展框架?

另外,根据需求,Spring框架可能会解决此问题以及我们可能想做的其他事情:http://www.springframework.org/

回答

我已经为过去编写的软件完成了此操作,非常方便。我首先创建一个接口,实现所有"插件"类都需要实现的接口。然后,我使用Java ClassLoader加载这些类并创建它们的实例。

一种解决方法是:

File dir = new File("put path to classes you want to load here");
URL loadPath = dir.toURI().toURL();
URL[] classUrl = new URL[]{loadPath};

ClassLoader cl = new URLClassLoader(classUrl);

Class loadedClass = cl.loadClass("classname"); // must be in package.class name format

已经加载了该类,现在我们需要创建它的实例,并假设接口名称为MyModule:

MyModule modInstance = (MyModule)loadedClass.newInstance();

回答

我建议我们仔细查看Java服务提供商(SPI)API。它提供了一个简单的系统来查找类路径上所有Jar中的所有类,这些类将自己暴露为实现特定服务。我过去在插件系统中使用它非常成功。

回答

查看OSGi。

一方面,OSGi提供了用于管理,启动和使用模块化软件组件执行许多其他操作的各种基础结构。另一方面,它可能无法满足需求。

顺便提及,Eclipse使用OSGi来管理其插件。

回答

使用本地的类加载器方法:
虽然这绝对是学习类加载器的好方法,但是有一种叫做"类加载器地狱"的东西,当在更大的项目中使用时,大多数人都为之着迷。冲突的类易于引入且难以解决。

十年前eclipse转向OSGi的理由很充分。
因此,如果它比宠物项目更多,请认真研究OSGi。它值得一看。
我们将学习有关类加载器以及新兴技术标准的信息。

回答

尽管我将接受公认的解决方案,但是如果需要基本的插件支持(大多数情况下是这种情况),那么还有Java Plugin Framework(JPF),尽管缺少适当的文档,但它是一个非常简洁的插件框架执行。

它很容易部署,当我们完成类加载特性时,很容易开发。对以上内容的评论是要注意,除了将其类文件部署在名为path的常规程序包路径中之外,还必须在完整类路径之后命名plugin目录下的插件加载路径。例如。

plugins
`-com.my.package.plugins
  `-com
    `-my
      `-package
        `-plugins
          |- Class1.class
          `- Class2.class