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

如何创建可插入的Java程序?,java,plugins,plugin-architecture,Java,Plugins,Plugin Architecture,我想创建一个可以用插件扩展的Java程序。我如何才能做到这一点,我应该在哪里寻找 我有一套插件必须实现的接口,它应该在一个jar中。程序应该在相对(程序)文件夹中监视新JAR,并以某种方式注册它们 虽然我确实喜欢EclipseRCP,但我认为它对于我的简单需求来说太多了 同样的道理也适用于春天,但既然我打算看看它,我还是试试吧 不过,我还是希望找到一种方法,尽可能简单地创建自己的插件“框架”。您是否考虑过在Eclipse的富客户机平台上构建插件,然后公开Eclipse扩展框架 另外,根据您的需

我想创建一个可以用插件扩展的Java程序。我如何才能做到这一点,我应该在哪里寻找

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


虽然我确实喜欢EclipseRCP,但我认为它对于我的简单需求来说太多了

同样的道理也适用于春天,但既然我打算看看它,我还是试试吧


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

您是否考虑过在Eclipse的富客户机平台上构建插件,然后公开Eclipse扩展框架


另外,根据您的需要,Spring框架可能会帮助您完成这项工作以及其他您可能想做的事情:

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

你可以这样做:

已加载该类的,现在需要创建该类的实例,假设接口名为MyModule:


我建议你仔细看看。它提供了一个简单的系统,用于查找类路径上所有JAR中的所有类,这些JAR将自己公开为实现特定服务。我过去曾在插件系统中使用过它,并取得了巨大的成功。

查看

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


顺便说一句,Eclipse使用OSGi来管理其插件。

采用自行开发的类加载器方法: 虽然这绝对是了解类加载器的一个好方法,但有一种叫做“类加载器地狱”的东西,当它用于更大的项目时,大多数人都知道它。冲突类很容易引入,也很难解决

几年前eclipse迁移到OSGi有一个很好的理由。 因此,如果它不仅仅是一个宠物项目,那么请认真研究一下OSGi。值得一看。
您将了解classloaders和一个新兴的技术标准。

尽管我支持公认的解决方案,但如果需要基本的插件支持(大多数情况下都是这样),还有(JPF),尽管缺少适当的文档,但它是一个非常整洁的插件框架实现

它很容易部署,而且——当您完成类加载特性时——非常容易使用它进行开发。对以上内容的注释是,插件目录下的插件加载路径必须以完整类路径命名,此外,其类文件必须部署在名为path的普通包路径中。例如

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

注意,sun.misc.Service类已被OSGi的类java.util.ServiceLoader.+1所取代。我发现它的大小介于简单的类加载器技巧(这将给您留下许多重新发明的机会)和EclipseRCP(用于不太复杂任务的大框架)之间。这是较早的,但另一个在最后变得更流行。我知道我在这个线程上有点晚,但是如果你想循环一个目录中所有给定的类并加载它们呢?有什么地方我可以在线看到一个工作的实现和代码吗?除此之外,我了解你们大多数人的代码,而且非常简单,谢谢+1@CodyRichardson这里有一个完整的简单实现示例;它使用Java 8和Gradle 4。@Alexiy感谢这个链接,它帮助了我很多,基本上是我所需要的一切。一开始有点复杂(主要是lambdas),但那只是因为我是一个javanoob:)我看了几遍,感觉好多了。谢谢你!我上面的链接已经不存在了,教程现在托管在这里-我尝试了这个变体和更多。但实际情况是:我不能将类强制转换为接口,因为这会引发ClassCastException。Java1.8或更大版本有问题吗?osgi很不错,但是对于启动时加载的小插件来说,它太大太复杂了
MyModule modInstance = (MyModule)loadedClass.newInstance();
plugins
`-com.my.package.plugins
  `-com
    `-my
      `-package
        `-plugins
          |- Class1.class
          `- Class2.class