2

コード以外のリソースを含む OSGi フラグメントがあります。これは事実上、一連のリソース (画像ファイルなど) を含む jar ファイルです。これは maven で構築しました。

リソースを含むフラグメントに依存する Maven を使用して別のバンドルを構築したいと思います。つまり、このバンドル内のコードが実行されるときに、フラグメントからのリソースがロードされ、Java の getResources() コマンドで使用できるようにする必要があります。

これどうやってするの?

4

1 に答える 1

1

bnd maven バンドル プラグインを使用してビルドする場合は、com.example.resource,com.example.images を実行するだけです。これにより、Maven クラスパスから独自の jar にリソースがコピーされます。既知の場所にフラグメントがある場合は、@resources/fragment.jar を実行することもできます。@ は、指定された jar の内容を抽出してバンドルに含めるように bnd に指示します。

別の解決策は、バンドルをフラグメントではなく通常のバンドルにして、オブジェクトを登録させることです。実行時にこのサービスを取得し、そこから getClass().getResource() を実行します。

 Object resource;

 @Reference(target="resource=myresource")
 void setObject(Object o) {
   this.resource = o;
 }


 void foo() {
       URL u = resource.getClass().getResource();
       ...
 }

リソース バンドルで行う必要があるのは、アクティベーターを使用して簡単に実行できるサービスを登録することだけです (もちろん、アクティベーターはこのバンドルに存在する必要があります)。または、BundleTracker を使用してエクステンダーを作成することもできます。マニフェストにヘッダーを配置し、見つかったときにリソースを提供するサービスを登録します。最後に、もちろん、インストールされたセットでバンドルを見つけて、そこからリソースを読み取ることもできます。

一般に、サービスに基づくこれらのソリューションは、(残念ながら) よく知られているクラス ローダーの「ハック」よりもはるかに柔軟です。

于 2013-01-21T09:19:48.237 に答える