私はOSGIを学ぼうとしています。(主に、バンドルの動的なロードとアンロード)。
Neil Bartlett のHow To Embed OSGiのチュートリアルに従って、Equinox OSGi フレームワークの実装をクラスパスに追加し、ゲームを開始しました。
コードは次のとおりです。
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
import org.osgi.framework.launch.Framework;
import org.osgi.framework.launch.FrameworkFactory;
public class BundleManager {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
FrameworkFactory frameworkFactory = ServiceLoader.load(
FrameworkFactory.class).iterator().next();
Map<String, String> config = new HashMap<String, String>();
//TODO: add some config properties
Framework framework = frameworkFactory.newFramework(config);
framework.start();
BundleContext context = framework.getBundleContext();
List<Bundle> installedBundles = new LinkedList<Bundle>();
installedBundles.add(context.installBundle(
"file:C:/Users/student/Documents/eclipse/myPlugins/HellowService.jar"));
for (Bundle bundle : installedBundles) {
if (bundle.getHeaders().get(Constants.FRAGMENT_HOST) == null)
bundle.start();
}
System.out.println("done!!");
}
}
はい、動作します。エラーはまったくありません。ただし、パスのjarファイルであるインストールしたバンドルにはC:/Users/student/Documents/eclipse/myPlugins/HellowService.jar
、開始メソッドに「HelloWorld」が含まれています。Eclipse コンソールに「HelloWold」が表示されません。バンドルが開始されたにもかかわらず、そのメッセージが表示されないのはなぜですか? 簡単な助けに感謝します。
注:HellowService.jar
以前に作成したプラグインプロジェクトで、そのクラスの1つにBundleActivatorを実装して、開始メソッドに「HelloWorld」メッセージを追加し、最後にjarファイルとしてディレクトリにエクスポートしましたC:/Users/student/Documents/eclipse/myPlugins/
編集:これが、インストールして開始しているバンドルのActivatorクラスです。
package com.javaworld.sample.service.impl;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import com.javaworld.sample.service.HelloService;
public class HelloServiceActivator implements BundleActivator {
ServiceRegistration helloServiceRegistration;
public void start(BundleContext context) throws Exception {
HelloServiceFactory helloServiceFactory = new HelloServiceFactory();
helloServiceRegistration =context.registerService(HelloService.class.getName(), helloServiceFactory, null);
System.out.println("Hello World!");
}
public void stop(BundleContext context) throws Exception {
helloServiceRegistration.unregister();
}
}
バンドルの MANIFEST.MF ファイルは次のとおりです。
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: HelloService
Bundle-SymbolicName: com.javaworld.sample.HelloService
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.javaworld.sample.service.impl.HelloServiceActivator
Bundle-Vendor: JAVAWORLD
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Import-Package: org.osgi.framework;version="1.3.0"
Export-Package: com.javaworld.sample.service
バンドルをエクスポートする方法は、バンドル プロジェクトを右クリックし、[エクスポート] -> [実行可能な Jar ファイル] -> [起動構成] を [BundleManager] (バンドルをインストールするクラス) に選択します。
「Hello World!」がまだ表示されません。アプリケーションからバンドルを開始したときのメッセージ。