5

私は、サービスをネイティブ実行可能ファイルのラッパーとして実装する OSGi バンドルに取り組んでいます。つまり、サービスは で実行可能ファイルを実行しProcessBuilder、データをフィードして、結果を取得します。私の質問は、このバンドルをパッケージ化する最良の方法についてです。ネイティブ実行可能ファイルには、多数の依存データ ファイルが含まれており、ツールを実行するには、これらすべてがディスク上に存在する必要があります。OSGi でのネイティブ DLL の扱いに関するリファレンスはたくさん見つかりましたが、クラスパスから取得できるだけでなく、ディスク上に存在する必要があるバンドルに関連付けられたファイルに対処するものはありません。

実行可能ファイルと依存ファイルをバンドル アーカイブに直接含めて、バンドルの開始時にプログラムでディレクトリに抽出できると考えていました。私が考えることができる他のオプションは、実行可能ファイルをどこかに置き、それまたは何かを指すシステムプロパティを設定することですが、構成を最小限に抑えたいと思います。

特定の OSGi 実装に固有ではない解決策があればよいのですが、そうでない場合、私は Equinox を使用しています。

ありがとう!

4

2 に答える 2

4

これらの追加ファイルは、ネイティブコードで書き込み可能である必要がありますか?そうでない場合は、好きなファイルをバンドルに入れることを妨げるものは何もありません。

OSGiで発生する通常の問題は、OSGiがファイルシステムが利用可能であると想定していないため、ファイルへのパスを計算することです(OSGiが組み込みデバイスで開始されたように聞こえるほど奇妙ではありません)。

ネイティブコードが関連ファイルを探す場所をどのように制御しますか?パスを渡す必要がありますか?

ディレクトリでコピーまたは解凍する場合は、次を使用します。

org.eclipse.core.runtime.Platform.getStateLocation()

これにより、バンドルの作業ディレクトリが提供されます。

バンドル内の特定のファイルのパスを検索する場合は、次の操作を実行できます。

org.eclipse.core.runtime.FileLocator.toFileURL((context.getBundle().getEntry("/etc/readme.txt")))

この場合、/etc/readme.txt現在のバンドル内のにファイルURLを返します。

どちらのコードも、アクティベーターのstart()メソッド内にあることを前提としています。

于 2009-09-15T11:44:33.853 に答える
2

もちろん、あなたのソリューションは機能します。ただし、インストール中に抽出して開始したリソースも停止して削除するように注意する必要があります。実行可能ファイルが何らかの種類の作業ファイルも作成した場合、これを追跡するのは特に難しい場合があります。

OSGi の強みの 1 つはライフサイクル管理であるため、これを行う必要があります。これにより、バンドルとサービスを跡形もなく削除することもできます。このため、フレームワークはバンドルが行うすべてのことを追跡します。実行可能ファイルをインストールして開始したバンドルを削除した後も実行可能ファイルを実行し続けると、接続が失われ、マシンが再起動されるまで実行し続ける可能性があります (多くの場合、組み込みシステムのオプションではありません)。

于 2009-09-13T08:38:30.360 に答える