2011-08-05 38 views
0

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

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

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

背景:

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

回答

0

推测你的注册方法是插件接口的一部分?

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

+0

终于得到了尝试这个,这似乎工作得很好,谢谢:) –

2

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

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

OSGI绝对适合这个,你看过吗Concierge?在部署的规模上它的可玩性很小。

+0

我没有看门房,我会看一看。对于你的解决方案,你正在讨论的清单文件是jar中的/META-INF/MANIFEST.MF,是正确的吗?我怎样才能读取该文件中的值? –

+0

@Bigwheels - 我使用术语清单来表示更一般的意义,不使用JAR清单文件可能是一个好主意。我会用一个例子来扩展我的答案。 – Perception

+0

好吧,你说什么是有道理的,只是我仍然不确定我将如何从该文件中的值到我的应用程序,所以我可以使用他们 –