Sunday, April 20, 2008 / Java

JavaでPluginを実現する方法

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

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

base.jarの用意

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

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

  • IFavoriteColor.class (プラグインが実装すべきインタフェース)
  • PrintFavoriteColor.class (プラグインを使うためのクラス)

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を実現する方法(改良版) を参照してください。