1

CORBA (jacorb) 経由で REDHAWK バックエンドにアクセスする Java Swing クラスの例を実行しています。例は OSGi アプリケーションです。Eclipse 内で、OSGiFramework 実行構成を使用してプロジェクトを実行します。アプリケーションは期待どおりに動作し、REDHAWK バックエンドと通信し、Java Swing UI をポップアップします。Eclipse によって作成された config.ini ファイルと dev.properties ファイルを使用して、Eclipse の外部でアプリケーションを実行します。以下に示すコマンドライン引数で次のエラーが発生します。コンソールから、jacorb バンドルがインストールされ、アクティブであることを確認しました。

/usr/lib/jvm/java-1.7.0-openjdk/bin/java -jar ./org.eclipse.osgi_3.8.2.v20130124-134944.jar  -dev file:dev.properties -os linux -ws gtk -arch x86 -application com.viper.swing.application -consoleLog -console

java.version=1.7.0_51
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86, WS=gtk, NL=en_US
Framework arguments:  -application com.viper.swing.application
Command-line arguments:  -dev file:dev.properties -os linux -ws gtk -arch x86 -application com.viper.swing.application -consoleLog -console

!ENTRY org.eclipse.osgi 4 0 2014-03-21 10:38:58.446
!MESSAGE Application error
!STACK 1
java.lang.NoClassDefFoundError: org/omg/CORBA/Object
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClassHoldingLock(ClasspathManager.java:632)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:607)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:568)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:492)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:465)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)
at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:395)

...

    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)
at org.eclipse.core.runtime.adaptor.EclipseStarter.main(EclipseStarter.java:151)

原因: java.lang.ClassNotFoundException: org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501) の org.omg.CORBA.Object org.eclipse.osgi.internal.loader.BundleLoader. org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412) の findClass(BundleLoader.java:421) org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107) の findClass(BundleLoader.java:421) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 75 詳細

4

2 に答える 2

1

標準の OSGi 環境では、java.* パッケージのみが OSGi フレームワークによって自動的にバンドルにインポートされます。Import-Package他のすべてのパッケージは、マニフェストのステートメントを介して明示的にインポートする必要があります。

特に eclipse/equinox は、通常は JRE に付属するクラスのクラス解決を、デバッグ/実行環境の標準 VM クラスローダーに委譲することが知られています。これは、Eclipse 環境外でバンドルを実行すると、インポートの欠落や一部のクラスが見つからないという例外についての苦情が発生することを意味します。

解決策は、インポートを修正するか、Eclipse 内で実行されているかのように動作するように外部環境を適応させることです。後者は、次の行を構成 (つまり、configuration/config.ini) に追加することで実行できます。

org.osgi.framework.bootdelegation=*
于 2014-03-25T09:57:25.433 に答える