插件框架和双向程序通信

时间:2015-06-25 07:27:41

标签: java plugins osgi

让两个不同的独立Java程序相互通信的好方法是什么?

我不确定是否要使用OSGi(但它似乎是唯一一个仍然获得更新的东西; jpf和jspf非常老)。我是插件框架主题的新手。我是对的,OSGi只是对架构,插件结构等的描述,而且equinox和所有这些其他东西都是真正的实现,我必须使用它?

我做得更精确:我想编写一个核心工具,它应该能够热插拔插件,并与它们和JavaFX GUI进行双向通信。

我通常使用一个类来控制GUI,另外一个类用于算法等(MVC)。但我认为这种风格不再有助于构建基于插件的工具。

我想从一开始就使用一个好的设计模式,否则它最终会变得一团糟。

2 个答案:

答案 0 :(得分:4)

此问题的最简单解决方案是使用ServiceLoader(doc here)。它包含在Java中,使用起来相当简单:

  1. 在运行时加载Jar文件
  2. 检测实现特定接口的类(例如:your.package.YourService)。
  3. 实例化这些类中的对象。
  4. Here是一篇非常好的帖子,描述了如何操作(注意:您应该使用第二个提案URLCLassLoader; 动态扩展类路径)。另外,不要忘记在Jar的META-INF目录中声明您的服务:

      

    如果com.example.impl.StandardCodecs是一个实现   CodecSet服务然后它的jar文件还包含一个名为

    的文件
    META-INF/services/com.example.CodecSet 
    
         

    此文件包含单行:

    com.example.impl.StandardCodecs    # Standard codecs
    

    通过选择这种方法,您的核心程序自然可以处理您的插件,因此可以轻松地与它们进行通信。为了确保双向通信(即调用核心程序的插件),我建议创建一个核心程序将实现的接口,并将该接口传递给您的插件。

    插件界面:

    public interface Plugin { 
       public void doPluginStuff(Caller caller);
    }
    

    核心计划Caller界面:

    public interface Caller {
       public void sendBackResults(Object results);
    }
    

    插件实现(在单独的Jar文件中):

    public class AParticularPlugin implements Plugin {
       public void doPluginStuff(Caller caller){
          caller.sendBackResults("Hello world");
       }
    }
    

    核心计划:

    public class CoreProgram implements Caller {
    
       public void callPlugin(URL[] urlToJarFiles){
          URLClassLoader ucl = new URLClassLoader(urlToJarFiles);
          ServiceLoader<Plugin> sl = ServiceLoader.load(Plugin.class, ucl);
          Iterator<Plugin> plugins = sl.iterator();
          while (plugins.hasNext())
             plugins.next().doPluginStuff(this);
       }
    
       public void sendBackResults(Object results){
          System.out.println(results.toString());
       }
    
    }
    

答案 1 :(得分:1)

一点回答&#34;对你的第一个问题。它更有可能是某种经验报告。

我在一些早期项目中使用Akka Framework来跨程序(和硬件)边界进行通信。

Akka是一个使用actor模式和消息的框架。它是用scala构建的,但也有一个很好的Java版本。

看一看:http://akka.io/

我还是新手,请不要犹豫,给我建议!

问候, 托