3

SnakeYaml は OSGi フレームワーク内で動作しますか? MANIFEST & such を修正して正しくデプロイできるようにしましたが、ドキュメントを JavaBean オブジェクト構造にロードしようとすると、「クラスが見つかりません」という例外が発生して失敗します。

ありがとう。

4

2 に答える 2

8

マニフェスト ヘッダーを追加して、OSGi サンドボックスで jar を適切に動作させるのと同じくらい簡単な場合もあります。OSGi のコンテキストで jar/library が「いたずら」をすることがあります。ゴールデン ルールは、OSGi がクラス ローダーを使用する方法のため、"Class.forName()" を使用しないことです。それ以外の場合は、単一のクラス ローダー環境で完全に有効です。ソースを SnakeYaml にプルダウンしました。これらは Bean ベースのローダーで、Class.forName を利用しています。

良いニュースは、コンストラクター CustomClassLoaderConstructor があるように見えることです。これにより、独自のクラスローダーを使用できるようになり、コア Yaml パーサー オブジェクトを作成するときにこれを使用できます。重要なのは、適切なクラス ローダーを取得することです。Yaml を使用しているバンドルのクラスローダーを使用する必要がありますが、作成されるすべてのクラスがそのバンドルにインポートされていることを確認する必要があります。インポートにより、必要なすべてのオブジェクトが OSGi が作成するクラスローダー ツリーにあることが確認されます。

バンドルに基づいて作成されたクラスローダーについては、この質問を参照してください。

于 2011-02-09T11:39:14.173 に答える
0

これに出くわした人にとっては、新しいバージョンのsnakeyamlはすでにosgi bundleです。ファイル MANIFEST.MF をいじる必要はありません。

次のように CustomClassLoaderConstructor を使用する必要があります。

import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.CustomClassLoaderConstructor;

CustomClassLoaderConstructor constructor = new CustomClassLoaderConstructor(this.getClass().getClassLoader());
Config config = new Yaml(constructor).loadAs(in, Config.class);

コードは org.yaml.snakeyaml;bundle-version="1.25.0" でテスト済み

于 2019-10-14T14:24:53.473 に答える