7

OSGiバンドルのコレクションとして実行されるアプリケーションがあります。Felixフレームワークを埋め込んだ非常に小さなラッパーを使用して開始します。そのラッパーの必要性は、Felixに依存しているという事実(たとえば、Equinoxでも同様にアプリケーション自体を実行できる)と同様に、私を少し苛立たせます。したがって、それを取り除き、デフォルトのFelixを使用したいと思います。ランチャー。

ラッパーが実際に行うのは、起動されたOSGiフレームワークにコマンドライン引数を渡すことだけです。これにより、そこでバンドルがそれらに反応できるようになります。実際には引数を解析せず、String[]をアプリケーションにプッシュするだけであることに注意してください。

カスタムランチャーを廃止できるように、バンドルからコマンドラインパラメーターにアクセスするための標準的な方法(または少なくともFelix標準の方法)はありますか?

4

4 に答える 4

9

bnd(tools) を使用すると、そのランチャーを使用できます。コマンド ライン引数をサービス プロパティ 'launcher.arguments' として登録します。

これは、bnd package コマンドと組み合わせると非常にうまく機能します。このコマンドは、実行環境 (バンドル、プロパティ、フレームワーク) を記述する bnd プロジェクトまたは bndrun ファイルを受け取り、スタンドアロンのメイン jar に変換します。したがって、bndtools で開発とデバッグを行い、問題がなければ、それを単一の実行可能な jar に変換します。例:

@Component
public class MyApp {
   String[] args;

   @Activate
   void activate() { 
      System.out.println("Args: " + Arrays.toString(args));
   }

   @Reference(target="(launcher.arguments=*)")
   void args( Object object, Map<String,Object> map) {
       args = (String[]) map.get("launcher.arguments");
   }
}

実行可能ファイルに変換するには:

bnd package myapp.bnd
java -jar myapp.jar -a somearg *.file
于 2012-11-30T07:50:16.267 に答える
2

遅い答えですが、おそらく誰かが役に立つと思います。

私はまったく同じ問題を抱えていました。私のアプリケーションは OSGi で実行されますが、準拠する必要がある外部インターフェイスがあり、コマンド ライン引数を読み取る必要があります。

その鍵となるのは、新しい OSGi 仕様 4.2 で定義されているもの、つまり Framework Launching です。これについては、Life Cycle Layer セクションの Draft 仕様 (www.osgi.org の Draft の下にあります) で読むことができます。

これは、スタンドアロンの Java アプリケーションから OSGi フレームワーク (OSGi 4.2 をサポートする任意の実装) を起動する標準的な方法です。気の利いたことは、CLASSPATH にある限り、開始する実装 (Felix、Equinox、...) を知る必要がないことです。

このようにして、ランチャー アプリケーションはコマンド ライン引数を読み取り、OSGi フレームワークをインスタンス化して開始し、引数をバンドルに (任意の方法で) 渡します。ランチャー アプリケーションで得られるのは、バンドルと通信できるフレームワークへのコンテキストです。

Equinox 3.5M6 (少なくとも M6 だと思います) の時点で、これはサポートされています。Apache Felix の最新バージョンもこれをサポートしています。

于 2009-05-20T14:20:49.770 に答える
1

I am aware that you searched for Felix only. Then, this Equinox-only solution might not be useful. I leave it here, because someone else might stumble over this question and has Equinox running.

From any bundle and any framework, it might be difficult. If you use the org.eclipse.core.runtime.applications extension point, is should be easy. Precondition: You do NOT pass -console as Parameter.

public class Application implements IApplication {

    @Override
    public Object start(IApplicationContext context) throws Exception {
        String[] args = (String[])context.getArguments().get("application.args");
        // args.length == 0 if no arguments have been passed
    }
}

Reference in plugin.xml

 <plugin>
    <extension
          id="myApp"
          point="org.eclipse.core.runtime.applications">
        <application>
          <run class="package.Application" />
        </application>  
    </extension>
 </plugin>
于 2013-01-05T01:16:20.547 に答える
1

おそらくそうではありません。標準の Felix ランチャーは、いくつかのコマンド ライン検証を行い、バンドル キャッシュ ディレクトリのみを引数として受け入れると思います。複数の引数とランチャーが終了します。

システム プロパティを使用してコマンド ラインで情報を渡すことができます。これは、felix だけでなく、他の osgi コンテナーでも機能すると思いますが、アプリケーションがユーザー フレンドリーでなくなる可能性があります。

于 2009-01-19T14:50:08.793 に答える