当前位置: 首页 > 知识库问答 >
问题:

用Java开发支持插件的应用程序

益英逸
2023-03-14

我一直在研究如何开发一个可以加载插件的应用程序。到目前为止,我已经看到,这可以通过定义一个接口并让插件实现来实现。

然而,我目前的问题是当插件被打包在罐子里时如何加载它们。有“最好”的方法吗?

我现在考虑的逻辑是让每个插件在它们的Jar中寻找实现接口的类。但我不知道怎么做这样的查找。我认为这个逻辑可能不是一个好的逻辑,但我找不到任何关于这个特定主题的有用信息。

**编辑1:**添加更多信息:预期的插件将是包含在主应用程序的Jar所在的子目录中的Jar文件,如下所示:

应用程序文件夹
|-主应用程序。jar
|-插件

等等

我希望应用程序能够在运行时加载文件夹中的所有插件。所以在代码中,它只知道插件的文件夹应该存在,并且在这样的文件夹中应该有JAR。

假设我有一个插件接口,如下所示:

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中的任何包中,并且有任何名称?

这是我想用这种插件做的更通用的方法。简而言之,我计划构建一个有标签的应用程序,每个插件将提供每个标签的界面和功能。我之所以这样做,是因为我希望能够单独维护每个选项卡,而不希望重新编译整个应用程序,因为只有一个组件中的更改不会影响其他组件。

共有2个答案

海鸣
2023-03-14

很老的问题,但如果有人搜索。。除了公认的答案,

  • 使用OSGI框架
    参考ApacheFelix获得参考实现
范楚
2023-03-14

获取插件jar列表:

File[] jars = new File("Plugins").listFiles();

然后,使用这个答案中关于从JAR文件加载所有类的代码,但对jars中名称以“.JAR”结尾的每个文件运行一次。在环体底部,在

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来限制插件代码的功能。

 类似资料:
  • 我的应用程序不支持下一代java插件,但在我的一个文档中,我看到了调试此应用程序的步骤,以设置jvm运行时参数为-Xdebug-Xrunjdwp:传输=dt_socket,地址=8000,服务器=y,挂起=y。 现在的问题是与此参数Internet Explorer是不是崩溃或挂起没有加载任何东西。一旦删除此参数解决了这个问题,应用程序运行正常。 那么,是否可以使用其他参数调试该应用程序?我也尝试

  • 到目前为止,我一直认为容器技术(例如:docker)提供了所需的隔离和操作系统级虚拟化。在容器中运行的应用程序受到名称空间、cgroup、设备/selinux、功能的限制,他们无法弄清楚自己所处的主机环境。但是这种理解似乎不是100%正确的。 与wiki-OS级虚拟化一样 操作系统级虚拟化是一种操作系统范例,其中内核允许存在多个独立的用户空间实例。这些实例称为容器(LXC、Solaris容器、Do

  • null null 在我的Alpine Linux安装上有什么建议来解决这个问题吗?

  • 由于我使用多个环境,我计划将App Insights检测键作为azure portal APP_SETTING的系统属性传递(值作为)。 我添加了所需的Maven依赖项,并且我的的App Insight instrumentation键引用为: 但不管用。当我直接硬编码密钥时,它起作用了。 在Spring中有没有具体的方法来引用系统属性以获取应用程序的洞察?

  • 对于hibernate,我在耳边添加了以下jar:hibernate-commons-annotations-4.0.5.final.jar、hibernate-core-4.3.11.final.jar和hibernate-entitymanager-4.3.11.final.jar。 对于seam,我包含了seam jar:jboss-seam.jar、jboss-seam-debug.jar

  • 我正在试用Play 2.6引入的新PlayService sbt插件(我的确切Play版本是2.6.20),我想将下面链接中提到的应用程序的停止挂钩用于这个基于PlayService插件的Play项目。 https://www.playframework.com/documentation/2.6.x/JavaDependencyInjection#Stopping/cleaning-向上 我的代