0

Equinoxフレームワークを実行するクラスがあります。ここで、フレームワークからサービスによって返されるオブジェクト(バンドルの1つで定義されている)を取得したいと思います。

残念ながら、LinkageErrorが発生し、それを取り除く方法がわかりません。サービスが適切なオブジェクトを非バンドルコードに返すようにすることさえ可能ですか?

これが完全な話です:

ParserDTOBundleは、クラスParserDTOを定義し、対応するパッケージをエクスポートするバンドルです。

別のバンドルであるParserServiceBundleでは、ParserServiceというサービスを定義しています。このバンドルは、ParserDTOのパッケージをインポートします。ParserServiceの関数getDTO()は、新しいParserDTOオブジェクトを作成し、それを返します。

ここで、Equinoxフレームワークを開始し、ディレクトリから両方のバンドルをロードする別のクラスを作成しました。

...
EclipseStarter.setInitialProperties(frameworkPropertiesMap);
bundleContext = EclipseStarter.startup(new String[] { "-console", "-dev", "bin" }, null);

bundleContext.installBundle("file:/" + dir + "ParserDTOBundle-0.0.1-SNAPSHOT.jar");
Bundle service = bundleContext.installBundle("file:/" + dir + "ParserServiceBundle-0.0.1-SNAPSHOT.jar");
service.start();

ServiceReference serviceReference = bundleContext.getServiceReference(ParserService.class.getName());

if (serviceReference != null) {
     ParserService ps = (ParserService) bundleContext.getService(serviceReference);
     if (ps != null) {
          ParserDTO dto = ps.getDTO();
          System.out.println(dto.getValue());
     }
 }

上記のクラスは、バンドルされていないMavenプロジェクトの一部です。上記のクラスの実行は次の場合に失敗します。

Exception in thread "main" java.lang.LinkageError: loader constraint violation: loader (instance of sun/misc/Launcher$AppClassLoader) previously initiated loading for a different type with name "de/ParserDTO"

興味深いことに、このエラーは前の行ではなくSystem.out.printlnで発生します。私のメインクラスのParserDTOクラスのクラスローダーは、オブジェクトdtoのクラスローダーとは明らかに異なります。

dtoに保存されている情報を取得するにはどうすればよいですか?それも可能ですか?1.)通常のクラスローダーをバンドルに渡すか、2。)代わりに基本的なデータ型を使用するか、3。)完全に別の方法で使用する必要がありますか?

よろしくお願いします!セバスチャン

4

1 に答える 1

0

したがって、クラスParserDTOは2つの異なるクラスローダーによって個別にロードされています。1つはバンドル内にあり、もう1つは「外部」アプリケーションのアプリケーションクラスローダーです。1つのクラスローダーによってのみロードされることを確認する必要があります。

この問題が2つの通常のバンドルで発生する場合、重要なのは、一方のバンドルがパッケージをエクスポートし、もう一方がパッケージをインポートすることを確認することです(または、両方が3番目のバンドルからインポートします)。

ただし、この場合、OSGi内の外部アプリケーションとバンドルの間で対話しています。厳しいルールがあります。OSGiフレームワークはOSGi内のバンドルからパッケージをインポートできません。したがって、パッケージは外部アプリケーションに存在し、に追加してシステムバンドルからエクスポートする必要がありFRAMEWORK_SYSTEMPACKAGES_EXTRAます。また、バンドルが独自のコピーを持つのではなく、そのパッケージをインポートすることを確認してください。

ところで...あなたはただよりもパッケージにもっと良い名前を選びたいかもしれませんde!あなたがドイツで唯一のJava開発者ではないと思うので、その名前空間を所有していません;-)

于 2012-07-10T14:44:39.933 に答える