bnd を使用すると、コマンド ライン アプリを非常に簡単に作成する方法があります。bnd には、package コマンドで実行可能な jar を作成する機能があります。
$ bnd run xyz.bnd
.... whatever your app does
$ bnd package xyz.bnd
$ ls
xyz.jar xyz.bnd .....
$ java -jar xyz.jar ...
.... whatever your app does
この jar は完全であることに注意してください。これには、すべてのバンドル、フレームワーク、ランチャー、およびそれを実行するためのプロパティが含まれています。外部依存関係はありません。
秘訣は、メイン スレッド (静的メインが呼び出される場所) を取得することです。Runnable サービスをプロパティに登録するだけですmain.thread=true
。次に、ランチャーはこのサービスで run() を呼び出してから終了します (必要なだけ実行を続けることができます)。
コマンド ライン引数を取得するには、launcher.arguments
プロパティを使用してオブジェクト サービスを取得します。このプロパティにはコマンド引数が含まれます。または、DS コンポーネントでこれを行うには:
@Component(immediate=true, property="main.thread=true")
public class Main implements Runnable {
String[] args;
public void run(){ ... }
@Reference(target="(launcher.arguments=*)")
void setArgs(Object service, Map<String,Object> props) {
this.args = (String[]) props.get("launcher.arguments");
}
}
これを行う最善の方法は、コードのテスト/デバッグを容易にする bndtools を使用することです。その場合、おそらく bndrun ファイルを使用したいと思うでしょう。
PS 最新の bnd では、Runnable の代わりに Callable<Integer> を使用できます。戻り値は、プロセスの終了コードです。ただし、これは bndtools にはまだ存在しない可能性があります。