我一直在研究如何开发一个可以加载插件的应用程序。到目前为止,我已经看到这可以通过定义一个接口来实现,并让插件实现它。
然而,我目前的问题是如何加载插件时,他们被打包成罐子。有什么“最好”的方法吗?
我正在考虑的当前逻辑是获取每个插件,并在它们的Jar中查找实现接口的类。但我不知道怎么查。我认为这个逻辑可能不是一个好的逻辑,但是我找不到关于这个特定主题的任何有用的信息。
** Edit1 1:**添加更多信息:预期的插件将是包含在主应用程序Jar所在的子目录中的Jar文件,如下所示:
应用程序文件夹
( Main_Application.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中的任何包中,并且有任何名称?
这是更通用的方法,我想做什么与这样的插件。简而言之,我计划构建一个有选项卡的应用程序,每个插件都将提供每个选项卡的接口和功能。我尝试这样做是因为我希望能够单独维护每个选项卡,并且不希望重新编译整个应用程序,因为只有一个组件的更改根本不影响其他组件。
发布于 2015-08-26 17:08:30
获取插件罐列表:
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来限制插件代码允许做的事情。
发布于 2020-11-18 12:38:47
很老的问题,但如果有人搜索..。在被接受的答案之外,
https://stackoverflow.com/questions/32205773
复制相似问题