Home About
Java

JavaでPluginを実現する方法

プラグイン機構は、開発時点では、どんな機能が追加されるかわからないときに使います。 それを Java で実現する方法を整理しました。

ここでは例として、 好きな色をコンソールにプリントする というコードで、どの色が好きか(をプリントするか)は、プラグインで解決する という場合を考えます。

base.jarの用意

プラグインを作成する上で必要となるクラスを詰め込んだ base.jar を用意します。 また、そのプラグインを使うクラスも一緒に入れておきます。

base.jarの中には、以下の2つのクラスが入っています。

IFavoriteColor.java

public interface IFavoriteColor{
    String getColor();
}

PrintFavoriteColor.java

import java.io.*;
import java.net.*;

public class PrintFavoriteColor {
    private File jarFile;
    private String className;
    public PrintFavoriteColor(File jarFile,String className){
        super();
        this.jarFile=jarFile;
        this.className=className;
    }
       
    public void print(){
        try { 
            URL url = jarFile.toURL(); 
            URLClassLoader loader = new URLClassLoader(new URL[]{url}); 

            Class c = loader.loadClass(className); 
            Object obj = c.newInstance(); 
            IFavoriteColor fc=(IFavoriteColor)obj;
            System.out.println( " My favorite color is "+fc.getColor()+"." );
        }
        catch(Exception e){ 
            e.printStackTrace();
        }
    }

    public static void main(String[] args){
        if(args.length==2){
            String jarFileName=args[0];
            String className=args[1];
    
            PrintFavoriteColor pfc = new PrintFavoriteColor(new File(jarFileName),className);
            pfc.print();
        }
    }
}

base.jarの作成

$ javac -classpath base.jar IFavoriteColor.java PrintFavoriteColor.java
$ jar cf base.jar *.class

mycolor.jar の用意

IFavoriteColorを実装した MyFavoriteColor クラスを作成し、mycolor.jar に詰めます。

public class MyFavoriteColor implements IFavoriteColor {
    public String getColor(){
        return "blue";
    }
}

mycolor.jarの作成

$ javac -classpath base.jar MyFavoriteColor.java
$ jar cf mycolor.jar *.class

作動確認

$ java -cp base.jar PrintFavoriteColor mycolor.jar MyFavoriteColor
 My favorite color is blue.

次のステップ

これでプラグインのしくみの基本はOKですが、このままでは、プラグインした jar (この例では mycolor.jar) に含まれている どのクラスを使えばいいのかを知らないとプラグインを使えない という致命的な問題があります。

これを改良して plugin 用の jar を追加しさえすれば使えるようにする方法は JavaでPluginを実現する方法(改良版) を参照してください。

Liked some of this entry? Buy me a coffee, please.