2009-09-11 13 views
5

私はネイティブ実行可能ファイルのラッパーとしてサービスを実装するOSGiバンドルに取り組んでいます。つまり、サービスはProcessBuilderで実行可能ファイルを実行し、いくつかのデータをフィードし、結果を取得します。私の質問は、このバンドルをパッケージ化する最良の方法です。ネイティブの実行可能ファイルには、ツールを実行するためにディスク上にすべて存在しなければならない多数の依存データファイルが含まれています。私は、OSGiのネイティブDLLを扱う際の参考文献をたくさん見つけましたが、クラスパスで検索できるのではなく、ディスク上に存在しなければならないバンドルに関連するファイルを扱っていません。OSGiバンドルに追加のリソースを含める

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

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

ありがとうございます!

答えて

2

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

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

4

これらの追加ファイルは、ネイティブコードで書き込み可能である必要がありますか?もしそうでなければ、あなたが好きなファイルをバンドル内に置くのを止めるものは何もありません。

OSGiの通常の問題は、OSGiはファイルシステムが利用可能であると想定していないため、ファイルへのパスを調べていることです。OSGiが組み込みデバイスで起動したときに聞こえるほど奇妙ではありません。

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

使用、その後、ものをコピーまたは解凍するディレクトリをしたい場合:

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

あなたにバンドルの作業ディレクトリを提供します。

あなたのバンドル内の特定のファイルのパスを検索したい場合は、あなたが行うことができます。この場合、現在のバンドルで/etc/readme.txtにファイルのURLを返します、

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

両方のコードは、アクティベータのstart()メソッド内にあると想定しています。

+0

OSGiサービスプラットフォームコア仕様リリース4バージョン4.3では、['BundleContext.getDataFile(String)'](https://osgi.org/javadoc/r4v43/core/org/osgi/framework/BundleContext.html#getDataFile% 28java.lang.String%29)、これは適切かもしれません。 –

関連する問題