jarファイルで拡張できるプログラムを作る

by orekyuu 0 Comments

簡単なプラグインシステムの実装方法みたいな感じです。
今回はJavatterβで使用した方法を紹介します。

まずはFileからJarFileインスタンスを作成し、マニフェストファイルの文字列を読み込みます。

File file=new File("plugin.jar");//Fileインスタンス作成
JarFile jar=new JarFile(file);//Fileのjarファイル作成
Manifest manifest=jar.getManifest();//マニフェストファイルの内容を取得
Attributes attributes = manifest.getMainAttributes();//マニフェストの属性を取得
String mainClassName = attributes.getValue("Plugin-Main");//マニフェストのPlugin-Main属性の文字列を取得

これでjarの中にあるマニフェストファイルの文字列を読み込めます。
Plugin-Mainはプラグインのjarを作った時に書いてもらいましょう。

これで作成したいインスタンスのクラス名が分かりました。

次にjar中にあるクラスファイルを検索パス内に追加します。
URLClassLoaderのaddURLメソッドを使うのですが、protectedになっているのでリフレクションで呼び出します。
http://docs.oracle.com/javase/jp/6/api/java/net/URLClassLoader.html

File file=new File("plugin.jar");
URLClassLoader loader=(URLClassLoader) getClass().getClassLoader();//URLClassLoaderを受け取る
Method m=URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});//addURLメソッドのMethodインスタンスを取得
m.setAccessible(true);//アクセスできるようにする
m.invoke(loader, new Object[]{file.toURI().toURL()});//fileのURLを引数に渡してaddURLメソッドを実行

これで検索パス内に入れることが出来たので、最初にJarのマニフェストから得た文字列をもとにインスタンスを作成します

String name="マニフェストから得た文字列";
URLClassLoader loader=(URLClassLoader) getClass().getClassLoader();
Class clazz=loader.load(name);//文字列からClassクラスのインスタンス作成
Plugin plugin=clazz.newInstance();//Classクラスからインスタンスを作成
plugin.hoge();//Pluginクラスのhogeメソッドを呼び出す

Pluginはインターフェースでもクラスでもなんでもいいです。
プラグインを作る側の人はPluginクラス(またはインターフェイス)を継承、実装なりして読み込んだ時にメソッドを動かすようにしておけばいいと思います。

間違っているところがあったりすればコメントでこっそり教えていただけると嬉しいです。

Javatter宣伝

by orekyuu 0 Comments

JavatterというTwitterクライアントを作成したので紹介したいと思います。
名前の通りJavaで作ったTwitterクライアントで、GUIはSwingでやってます。
このクライアントの特徴はプラグインを作成できるところですね。自分のほしい機能を作って拡張できるわけです。良かったら使ってくださいね!

Javatterのサイト:http://www1221uj.sakura.ne.jp/wordpress/

Javatterプラグインフォーラム:http://www1221uj.sakura.ne.jp//bbs/index.php

Javatterのリポジトリ:https://github.com/orekyuu/Javatter_for_PC 
PullRequestしてもいいのよ?