コード以外のリソースを含む OSGi フラグメントがあります。これは事実上、一連のリソース (画像ファイルなど) を含む jar ファイルです。これは maven で構築しました。
リソースを含むフラグメントに依存する Maven を使用して別のバンドルを構築したいと思います。つまり、このバンドル内のコードが実行されるときに、フラグメントからのリソースがロードされ、Java の getResources() コマンドで使用できるようにする必要があります。
これどうやってするの?
コード以外のリソースを含む OSGi フラグメントがあります。これは事実上、一連のリソース (画像ファイルなど) を含む jar ファイルです。これは maven で構築しました。
リソースを含むフラグメントに依存する Maven を使用して別のバンドルを構築したいと思います。つまり、このバンドル内のコードが実行されるときに、フラグメントからのリソースがロードされ、Java の getResources() コマンドで使用できるようにする必要があります。
これどうやってするの?
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 を使用してエクステンダーを作成することもできます。マニフェストにヘッダーを配置し、見つかったときにリソースを提供するサービスを登録します。最後に、もちろん、インストールされたセットでバンドルを見つけて、そこからリソースを読み取ることもできます。
一般に、サービスに基づくこれらのソリューションは、(残念ながら) よく知られているクラス ローダーの「ハック」よりもはるかに柔軟です。