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。)完全に別の方法で使用する必要がありますか?
よろしくお願いします!セバスチャン