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

时间:2008-08-24 23:28:39

标签: java plugins plugin-architecture

我想创建一个可以使用插件扩展的Java程序。我怎么能这样做,我应该在哪里寻找?

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


虽然我喜欢Eclipse RCP,但我认为这对我的简单需求来说太过分了。

对于Spring来说也是如此,但是因为无论如何我都会去看它,不妨试试吧。

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

6 个答案:

答案 0 :(得分:44)

我已经为过去编写的软件做过这个,非常方便。我首先创建了一个接口,我需要实现所有“插件”类。然后我使用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();

答案 1 :(得分:17)

查看OSGi

一方面,OSGi提供各种基础设施,用于管理,启动和使用模块化软件组件执行许多其他操作。另一方面,它可能对你的需求来说太重了。

顺便说一下,Eclipse使用OSGi来管理它的插件。

答案 2 :(得分:15)

我建议您仔细查看the Java Service Provider (SPI) API。它提供了一个简单的系统,用于查找类路径中所有Jars中的所有类,这些类将自身暴露为实现特定服务。我过去使用过它,插件系统非常成功。

答案 3 :(得分:6)

虽然我会接受所接受的解决方案,如果需要基本的插件支持(大多数时候都是这种情况),还有Java Plugin Framework(JPF)虽然缺乏适当的文档,但是一个非常简洁的插件框架实现。

它易于部署 - 当你通过类加载idiosynchrasies时 - 非常容易开发。对上述内容的评论是要注意插件目录下的插件加载路径必须在完整类路径之后命名,此外还要将其类文件部署在名为path的普通包路径中。 E.g。

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

答案 4 :(得分:4)

在本土的类加载器方法中: 虽然它绝对是学习类加载器的好方法,但有一种叫做“类加载器地狱”的东西,大多数人都知道在大型项目中使用它时会遇到它。冲突的课程很容易引入,很难解决。

有一个很好的理由让eclipse在几年前转向OSGi。 因此,如果它不仅仅是一个宠物项目,请认真研究OSGi。值得一看。 您将了解类加载器以及新兴的技术标准。

答案 5 :(得分:1)

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

此外,根据您的需求,Spring Framework可能会帮助您完成这些以及您可能想要做的其他事情:http://www.springframework.org/