[英]Developing application with plugin support in Java
我一直在研究如何开发一个可以加载插件的应用程序。 到目前为止,我已经看到这可以通过定义一个接口来完成,并让插件实现它。
但是,我当前的问题是如何在将插件打包到 Jars 时加载它们。 有没有“最好”的方法来做到这一点?
我正在考虑的当前逻辑是获取每个插件并在它们的 Jar 中查找实现接口的类。 但我不知道如何进行这样的查找。 我认为这种逻辑可能不是一个好的逻辑,但是我找不到有关此特定主题的任何有用信息。
**Edit1:** 添加更多信息:预期的插件将是包含在主应用程序 Jar 所在子目录中的 Jar 文件,如下所示:
应用程序文件夹
|- Main_Application.jar
|- 插件
|- Plugin1.jar
|- Plugin2.jar
|- Steve's_plugin.jar
等等。
我期望应用程序能够在运行时加载文件夹内的所有插件。 所以在代码中,它只会知道插件的文件夹应该存在,并且这样的文件夹中应该有 Jars。
假设我有一个这样的插件界面:
interface Plugin
{
public void run();
}
插件将由实现此类接口的类标识,如下所示
class Plugin1 implements Plugin
{
//attributes and other methods
@override
public void run()
{
//something happens here
}
}
class Plugin2 implements Plugin
{
//attributes and other methods
@override
public void run()
{
//something happens here
}
}
应用程序应该只编译一次,并且能够在执行时加载添加到文件夹中的任何插件。 为了使应用程序能够加载任何插件,我是否需要对 Jar 的内容建立规则,例如包名和实现接口的类? 或者期望实现插件接口的类可以在 Jar 中的任何包中,并且具有任何名称?
这是我想用这些插件做的事情的更通用的方法。 简而言之,我计划构建一个具有选项卡的应用程序,每个插件都将提供每个选项卡的界面和功能。 我尝试这样做是因为我希望能够分别维护每个选项卡,并且不想因为只对一个组件进行更改而根本不影响其他组件而重新编译整个应用程序。
获取插件 jar 列表:
File[] jars = new File("Plugins").listFiles();
然后,使用此答案中有关从 JAR 文件加载所有类的代码,但对名称以".jar"
结尾的jars
文件中的每个文件运行一次。 在循环体的底部,在
Class c = cl.loadClass(className);
继续
if (Plugin.class.isAssignableFrom(c)) {
Plugin plugin = (Plugin) c.newInstance();
// And then, do something with the plugin here
}
我分享@Mifeet 对安全性的担忧 - 您可能想要使用SecurityManager来限制插件代码可以执行的操作。
很老的问题,但如果有人搜索仍然相关.. 添加到已接受的答案中,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.