我想创建一个可以使用插件扩展的Java程序.我怎么能这样做,我应该在哪里寻找?
我有一组插件必须实现的接口,它应该在一个jar中.程序应该在相对(程序)文件夹中监视新的jar并以某种方式注册它们.
虽然我喜欢Eclipse RCP,但我认为这对我的简单需求来说太过分了.
对于Spring来说也是如此,但是无论如何我都要去看它,我不妨试试吧.
但是,我仍然希望找到一种尽可能简单的方法来创建自己的插件"框架".
我已经为过去编写的软件做过这个,非常方便.我首先创建了一个接口,我需要实现所有"插件"类.然后我使用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();
看看OSGi.
一方面,OSGi提供各种基础设施,用于管理,启动和使用模块化软件组件执行许多其他操作.另一方面,它可能对你的需求来说太重了.
顺便说一句,Eclipse使用OSGi来管理其插件.
我建议您仔细查看Java服务提供程序(SPI)API.它提供了一个简单的系统,用于查找类路径中所有Jars中的所有类,这些类将自身暴露为实现特定服务.我过去使用过它,插件系统非常成功.
虽然我会接受所接受的解决方案,如果需要基本的插件支持(大多数时候都是这种情况),还有Java插件框架(JPF)虽然缺乏适当的文档,但它是一个非常简洁的插件框架实现.
它易于部署 - 当你通过类加载idiosynchrasies时 - 非常容易开发.对上述内容的评论是要注意插件目录下的插件加载路径必须在完整的类路径之后命名,此外还要将其类文件部署在名为path的普通包路径中.例如
plugins `-com.my.package.plugins `-com `-my `-package `-plugins |- Class1.class `- Class2.class