0

私は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!」がまだ表示されません。アプリケーションからバンドルを開始したときのメッセージ。

4

2 に答える 2

1

ランチャーは、OSGi フレームワークが停止するのを待ちません。mainこのプログラムはすべてを開始すると思いますが、メソッドの最後に到達したため、すぐにシャットダウンします。メソッドの使用方法を示すチュートリアルを参照してくださいFramework.waitForStop

そうは言っても、シャットダウンの前に HelloWorld バンドルからの出力が実際に表示されることを期待しています。したがって、そのバンドルにもエラーがある可能性があります。おそらく、アクティベーターを宣言していませんか?詳細が書かれていないので推測でしかありません。

于 2013-07-21T09:26:07.803 に答える
0

バンドルを間違ってエクスポートしていたことが判明しました。それは自分でやろうとしたからです。バンドルを jar ファイルとしてエクスポートする方法は次のとおりです。

   Open the plugin export wizard File > Export... > Plug-in Development >
   Deployable plug-ins and fragments . 
   Then select the bundle you want to export and the destination directory. Done!

これで、jar ファイルのパスを使用してバンドルをインストールできるようになりました。私の場合、それは次のとおりです。

 installedBundles.add(context.installBundle(
                              "file:C:/Users/student/Documents/eclipse/myPlugins/plugins/com.javaworld.sample.HelloService_1.0.0.201307220322.jar"));

ソース: http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.pde.doc.user%2Fguide%2Ftools%2Fexport_wizards%2Fexport_plugins.htm

そして確かに@Neil Bartlettに感謝します

于 2013-07-21T23:28:36.713 に答える