SnakeYaml は OSGi フレームワーク内で動作しますか? MANIFEST & such を修正して正しくデプロイできるようにしましたが、ドキュメントを JavaBean オブジェクト構造にロードしようとすると、「クラスが見つかりません」という例外が発生して失敗します。
ありがとう。
マニフェスト ヘッダーを追加して、OSGi サンドボックスで jar を適切に動作させるのと同じくらい簡単な場合もあります。OSGi のコンテキストで jar/library が「いたずら」をすることがあります。ゴールデン ルールは、OSGi がクラス ローダーを使用する方法のため、"Class.forName()" を使用しないことです。それ以外の場合は、単一のクラス ローダー環境で完全に有効です。ソースを SnakeYaml にプルダウンしました。これらは Bean ベースのローダーで、Class.forName を利用しています。
良いニュースは、コンストラクター CustomClassLoaderConstructor があるように見えることです。これにより、独自のクラスローダーを使用できるようになり、コア Yaml パーサー オブジェクトを作成するときにこれを使用できます。重要なのは、適切なクラス ローダーを取得することです。Yaml を使用しているバンドルのクラスローダーを使用する必要がありますが、作成されるすべてのクラスがそのバンドルにインポートされていることを確認する必要があります。インポートにより、必要なすべてのオブジェクトが OSGi が作成するクラスローダー ツリーにあることが確認されます。
バンドルに基づいて作成されたクラスローダーについては、この質問を参照してください。
これに出くわした人にとっては、新しいバージョンの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" でテスト済み