1

私はいくつかのバンドルで構成される OSGi プログラムを開発しています。これらのバンドルは、ローカルの Windows 開発コンピューターで実行することもあれば、従来の Linux で実行することもあります。現在、リソース接続専用のいくつかのバンドルには、いくつかの重要なファイル (両方の環境に存在する) にアクセスするためのパスなどの情報を含む独自の構成ファイル (プロパティ ファイル) があります。

ただし、2 つの実行環境ではパスが異なるため、プログラムを実行する環境に応じて、コンパイルの前に構成を手動で変更する必要があります。

バンドルが外部構成ファイルを参照する方法はありますか? 解決策は、環境ごとに 1 回だけ生成するフラグメントを作成することですが、フラグメントの jar にあるため、構成ファイルを簡単に変更することはできません。

「単純な」問題を解決するために知っておくべき「ベストプラクティス」はありますか?

4

2 に答える 2

6

OSGi の ConfigurationAdmin [1][2]を見てください - これはあなたのニーズにぴったり合うでしょう (そして、OSGi のエレガンスのもう 1 つの例です)。

基本的には、ManagedServiceまたはManagedServiceFactoryを実装し、残りは ConfigurationAdmin サービスが処理します。

File Install と組み合わせて使用​​されるFelix 実装のデフォルト設定(Angelo のコメントを参照) は、構成ファイルのディレクトリをスキャンします (ファイル名はサービス ID で、ファイル接尾辞は .cfg です)。ただし、ConfigurationAdmin はプラグ可能であるため、構成のバックエンドはデータベースなどになる可能性があります。

このように構成を外部化することの優れた点は、それを app/environment と共に保持できることです。そのため、バンドルは環境に依存しなくなります。

于 2012-04-19T09:55:05.990 に答える
5

@earcam の優れた提案を拡張して、Declarative Services と Metatype を介して構成をバインドすることをお勧めします。特に Felix アノテーションを使用すると、非常に簡単になります。以下は、認証に JAAS を使用するサービスの簡単な例であり、構成可能な JAAS レルム名があります。「ConfigurationPolicy.OPTIONAL」は素晴らしい部分です。これを REQUIRE に設定すると、サービスは設定されるまで登録されません。

@Component(
        name = "com.example.authprovider",
        label = "Example authentication interceptor",
        description = "Blocks unauthenticated access to REST endpoints",
        specVersion = "1.1",
        metatype = true,
        policy = ConfigurationPolicy.OPTIONAL
)
@Service
@References({
        ...
})
@Properties({
        @Property(name="jaasRealm", value = "default", label="JAAS Realm",
                description = "the JAAS realm to use to find LoginModules to authenticate this login"),
        ...
})
public class Foo implements ... {
    ...
}

このアプローチを採用し、Apache Karaf のようなメタタイプに適したコンテナーを使用すると、管理 Web コンソールで自動生成された構成 UI を無料で取得できます。

于 2012-04-20T12:32:13.143 に答える