如何在java中编写自己的插件加载器?

时间:2011-09-28 17:43:28

标签: java plugins add-on

如何在我的java程序中实现插件工具?

我正在使用Java。我当前的项目是与通用电子硬件相关的东西,它具有自定义命令集。

现在有一个通用的GUI可供人们访问硬件。硬件在不同环境中以不同方式运行,即针对不同客户端。现在的问题是GUI必须能够添加插件。插件意味着,它必须能够为拥有该特权的客户提供特定设施。从客户方面来说,添加插件非常简单,只需单击按钮即可添加特定设施。

我认为插件的原因是,只有在交付核心产品后才会引入越来越多的设施。

4 个答案:

答案 0 :(得分:8)

您需要提供以下内容:

  • 创建一个API,您的插件可用于更改/扩展程序的行为(恕我直言,这是最棘手的部分)
  • 定义插件的公共条目,例如,特定于插件的属性文件,用于定义插件的入口点或扩展点(实现接口的插件类的类名)
  • 从您选择的位置动态加载插件,例如,来自特定目录的所有* .jar文件(请查看URLClassLoader

API建议:

  • 更喜欢接口而不是(抽象)类
  • 帮助用户快速查看可以实现的接口(例如IAction,注意前导I)以及应用程序提供的插件使用情况(例如, WindowManager

答案 1 :(得分:2)

您可以随时向应用程序添加jar或插件。你没有必要做任何特别的事情来实现这一点。

如果您使用OGSi,您可以更轻松地管理它,支持同一个jar的多个版本,并在应用程序运行时将其删除。我建议看看Apache Karaf + iPOJO

答案 2 :(得分:2)

在任何面向对象语言中实现插件的主要思想是定义插件和相关类必须实现的一组公共接口,然后通过反射加载和实例化它们......

您可以使用抽象工厂模式,以便插件所需的任何对象都可以实例化......

假设您的插件架构只有3个接口,每个插件必须提供实现这些接口的类,那么您的插件架构可能是这样的:

public interface PluginInterfaceA {
//Define API here
};

public interface PluginInterfaceB {
// Define API here
};

public interface PluginInterfaceC {
// Define API here
};

public interface PluginFactory {
/**
 * Creates plugin A object.
 */
PluginInterfaceA createPluginA();
/**
 * Creates plugin B object.
 */
PluginInterfaceB createPluginB();
/**
 * Creates plugin C object.
 */
PluginInterfaceC createPluginC();
};

然后让插件在XML文件或属性文件中定义插件的插件工厂的类名:

例如,假设你的插件定义了:

package com.my.plugin;

public class PluginAImpl implements PluginInterfaceA {
// Code for the class
};

public class PluginBImpl implements PluginInterfaceB {
// Code for the class
};

public class PluginCImpl implements PluginInterfaceC {
// Code for the class
};

public class PluginFactoryImpl implements PluginFactory {
public PluginInterfaceA createPluginA() {
  return new PluginAImpl();
}
public PluginInterfaceB createPluginB() {
  return new PluginAImpl();
}
public PluginInterfaceC createPluginC() {
  return new PluginAImpl();
}
};

然后在属性文件中定义 //插件的plugin.jar中提供的文件plugin.properties plugin.factory.class = com.my.plugin.PluginFactoryImpl;

在你的应用程序中可以做到

Properties properties = new Properties();
properties.load(this.getClass().getClassLoader().getResourceAsStream("plugin.properties"));

String factoryClass = properties.get("plugin.factory.class");

PluginFactory factory = Class.forName(factoryClass);

PluginInterfaceA interfaceA = factory.createPluginA();
PluginInterfaceB interfaceB = factory.createPluginB();
PluginInterfaceC interfaceC = factory.createPluginC();

//这里可以根据需要调用创建的类。

由于 巴勃罗

答案 3 :(得分:0)

JAR文件格式为its own little system for managing plugins,用于Java SE的多个部分,包括JDBC驱动程序管理。只需定义一个服务接口,将带有实现的JAR文件放在类路径上,然后使用ServiceLoader.load加载实现。