动态加载jar并在其中执行任意代码

时间:2011-08-05 21:00:44

标签: java jar dynamic-loading

我正在编写一个java控制台应用程序,我希望人们能够为它编写插件,然后将这些插件分发为jar。我希望用户能够将插件(jar)放入“plugins”文件夹,重新启动应用程序,然后加载并运行插件。我不希望用户必须为插件或类似的东西指定一个类/方法。

我可以将带有通配符类路径的jar加载到“plugins”目录,但我需要一些方法让这些插件通过运行每个插件需要在某处定义的register()方法向应用程序注册自己。插件(jar)如何指定定义register()方法的位置(包和类),以便我的应用程序知道如何调用它?

我意识到OSGi可以做到这一点,但这是一个相当小的应用程序,如果存在更简单的解决方案,我宁愿不使用OSGi。

背景:

这些插件从他们想要处理的应用程序中注册事件。用户将能够基于每个插件禁用特定事件的处理,因此这些插件的配置将存储在应用程序的数据库中。当插件自身注册时,应用程序将检查数据库以查看该插件是否存在配置,如果不存在,它将在数据库中为其创建新的默认配置。

3 个答案:

答案 0 :(得分:2)

为应用程序定义标准化此行为的清单文件。您可以将其实现为属性文件,XML或您选择的任何格式。清单文件将包含标准属性名称,其值为插件的“启动类”。让用户从您定义的接口或抽象类扩展此启动类,以便您可以强制执行预期的行为(也就是说,使用'register'方法)。

然后,最终用户将其类文件和清单捆绑到JAR中,并将其分发到应用程序的插件文件夹中。

OSGI绝对适合这一点,你看过Concierge吗?它的部署规模非常小。

答案 1 :(得分:0)

大概你的注册方法是Plugin接口的一部分吗?

如果是这样,您可以实现自定义ClassLoader来检测实现此接口的类。然后使用基于监听器的方法通知任何对象管理类的存在的插件。

答案 2 :(得分:0)

还有另一个帖子,你可能会觉得有用

How should I load Jars dynamically at runtime?

同时尝试查看Jar class loader