0

Eclipse/Equinox OSGi Framework を既存のアプリケーションに組み込む必要があります。

このチュートリアルhttp://njbartlett.name/2011/03/07/embedding-osgi.htmlを見つけて、FRAMEWORK_SYSTEMPACKAGES_EXTRA Constans を使用しようとしました。

そのため、単純な Java クラスをシステム バンドルによって実行中のフレームワークにエクスポートしようとしましたが、アクティベーター バンドルから次のエラーが表示されます。

    Exception in thread "main" org.osgi.framework.BundleException: The activator com.bundleactivator.Activator for bundle com.bundleactivator is invalid
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator(AbstractBundle.java:156)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:751)
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:370)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:284)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:276)
at RunNewEquinoxOsgi.main(RunNewEquinoxOsgi.java:74)
    Caused by: java.lang.Error: Unresolved compilation problem: 
The import example cannot be resolved

at com.bundleactivator.Activator.<init>(Activator.java:8)
at java.lang.J9VMInternals.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1505)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator(AbstractBundle.java:151)
... 5 more

アクティベーターのシステム バンドルから example.osgi パッケージをインポートした場所で例外がスローされる

    import example.osgi.Example;

別のJavaクラスでFrameworkFactoryでequinoxを立ち上げる

    import java.util.HashMap;
    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.ServiceReference;
    import org.osgi.framework.launch.Framework;
    import org.osgi.framework.launch.FrameworkFactory;
    import example.osgi.*;

    FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next();
    Map<String, String> config = new HashMap<String, String>();
    config.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,
    "example.osgi;version=\"1.0.0\"");
    try {
        framework.start();
        System.out.println("Framework start");
    } catch (BundleException e) {
        e.printStackTrace();
    }

    BundleContext ctx = framework.getBundleContext();

    Bundle b3 = ctx.installBundle("file:C:\\equinoxtest\\ds.jar");
    System.out.println(b3.getBundleId() + " installed");
    Bundle b4 = ctx.installBundle("file:C:\\equinoxtest\\services.jar");
    System.out.println(b4.getBundleId() + " installed");
    Bundle b5 = ctx.installBundle("file:C:\\equinoxtest\\util.jar");
    System.out.println(b5.getBundleId() + " installed");
    Bundle b6 = ctx.installBundle("file:C:\\equinoxtest\\service.jar");
    System.out.println(b6.getBundleId() + " installed");
    Bundle b7 = ctx.installBundle("file:C:\\equinoxtest\\rule1.jar");
    System.out.println(b7.getBundleId() + " installed");
    Bundle b8 = ctx.installBundle("file:C:\\equinoxtest\\rule2.jar");
    System.out.println(b8.getBundleId() + " installed");
    Bundle b9 = ctx.installBundle("file:C:\\equinoxtest\\rule3.jar");
    System.out.println(b9.getBundleId() + " installed");
    Bundle b10 = ctx.installBundle("file:C:\\equinoxtest\\activator.jar");
    System.out.println(b10.getBundleId() + " installed");

    b3.start();
    b4.start();
    b5.start();
    b6.start();
    b7.start();
    b8.start();
    b9.start();
    b10.start(); // here i start the activator

これはアクティベータークラスのマニフェストです

    Manifest-Version: 1.0
    Bundle-ManifestVersion: 2
    Bundle-Name: BundleActivator
    Bundle-SymbolicName: com.bundleactivator
    Bundle-Version: 1.0.0.qualifier
    Bundle-Activator: com.bundleactivator.Activator
    Bundle-RequiredExecutionEnvironment: JavaSE-1.6
    Import-Package: com.bundleservice,
     example.osgi;version="1.0.0";resolution:=optional,
     org.osgi.framework;version="1.3.0",
     org.osgi.util.tracker;version="1.4.0"
    Bundle-ActivationPolicy: lazy
    Export-Package: com.bundleactivator

OSGi コンソールでは、システム バンドル エクスポートにこのパッケージ (example.osgi) が表示されますが、インポート クラス (アクティベーター) が例外をスローします。他に何をすべきですか?

    >osgi packages 0
    ...
    example.osgi; version="1.0.0"<org.eclipse.osgi_3.6.2.R36x_v20110210 [0]>
4

1 に答える 1

0

このエラー:

 java.lang.Error: Unresolved compilation problem

Eclipse でコードをビルドしているが、コンパイル エラーがあることを示します。コードを実行する前に、コードをコンパイルする必要があります。

背景情報: Eclipse はコンパイルにこのコマンドを使用しませんjavac。ECJ と呼ばれる Java コンパイラが組み込まれています。このコンパイラは、IDE 内で段階的に使用できるように設計されており、エラーが発生した場合でも処理を継続できるように最善を尽くします。したがって、それでも有効な .class ファイルが生成されますが、実際にエラーのあるクラスに触れる何かを実行しようとすると、上記のランタイム エラーが発生します。対照的にjavac、コンパイル エラーが発生すると停止するだけで、実行可能な .class ファイルは生成されません。

于 2013-09-18T19:03:18.867 に答える