2008年2月23日土曜日

Apache Felixをプラットフォームにする.

追記 2008/06/28 これを元にMac用のアプリを作りました.


Apache FelixはOSGi R4 Service Platformの実装です.
まぁ端的に言えばプラグイン(Plugin)型(OSGiではバンドル(Bundle)と呼ぶ)のアプリケーションを作る上での土台みたいなモノです.
で,そのやり方をちょこっと書いてみます.
0.材料
 ここからdownload. (Felix 1.0.3)
 必要なのはfelix-1.0.3/bin/felix.jar
1.Eclipse Projectでやってみる.
 ここではJava Project.
 'FelixApplicatin'という名前.
 '.class'ファイルの場所を分けるため,'project layout'の設定でsrc/binをもうける方にする.(趣味?)

 でとりあえず作成しちゃう.
2.外部jarの設定
 プロジェクト名上で右クリックにてコンテクストメニューを出す.
 'Build Path / Add External Archive...' にてfelix.jarを追加.


3.Main classを作る
 起動用のMain class( example.Main )をsrcの下に作る.
 で,コードはこんな感じ.
src/example/Main.java
package example;

import java.util.Map;
import java.util.List;
import java.util.ArrayList;
import org.osgi.framework.Constants;
import org.apache.felix.framework.Felix;
import org.apache.felix.framework.cache.BundleCache;
import org.apache.felix.framework.util.StringMap;
import org.apache.felix.main.AutoActivator;

public class Main {
private static Felix felix = null;

private static String join(List list, String d) {
if (list.isEmpty()) {
return "";
}
StringBuffer ret = new StringBuffer((String) list.get(0));
for (int i = 1; i < list.size(); i++) {
ret.append(d);
ret.append((String) list.get(i));
}
return ret.toString();
}

private static String getString_SystemPackages() {
List list = new ArrayList();
list.add("org.osgi.framework; version=1.3.0");
list.add("org.osgi.service.packageadmin; version=1.2.0");
list.add("org.osgi.service.startlevel; version=1.0.0");
list.add("org.osgi.service.url; version=1.0.0");
return join(list, ",");
}

public static String PLUGINS_LOCATION = "file:/path/to/plugins/"; // http:でもいいよ

private static String getString_AutoStartProp() {
List list = new ArrayList();
list.add(PLUGINS_LOCATION + "tutorial.example1_1.0.0.jar");
return join(list, " ");
}

public static void main(String[] argv) throws Exception {
Map configMap = new StringMap(false);
configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES,
getString_SystemPackages());
configMap.put(AutoActivator.AUTO_START_PROP + ".1",
getString_AutoStartProp());
configMap.put(BundleCache.CACHE_PROFILE_DIR_PROP, "cache");

List activators = new ArrayList();
activators.add(new AutoActivator(configMap));
felix = new Felix(configMap, activators);
try {
felix.start();
} catch (Exception ex) {
System.err.println("Could not create framework: " + ex);
ex.printStackTrace();
System.exit(-1);
}
}
}


4.で,このMainを起動.
 なんだけど上の例ではtutorial.example1_1.0.0.jarというjarをpluginとして読み込んでる.
 こいつは"Apache Felix Tutorial Example 1"で作り方が書かれているサンプルPlugin.
 で,これについてはまた今度.

ここまでのプロジェクトツリーはこんな感じ.

#'cache'は実行すると作られる.
#コードの'(1)'で定義している名前となる.

参考: ありがとうございました.
Apache Felix - Launching and Embedding Apache Felix
Gridshore » Blog Archive » Starting with OSGi using apache felix (step 1)

0 件のコメント: