1

ユーザーから Maven の依存関係のリストをいくつか取得し、それぞれを解決して、含まれているアプリケーションとしてロードしたいと思います。手順は次のとおりです。

  1. すべての Maven 依存関係のリストを収集する (DONE)
  2. すべての依存関係を Aether で解決する (DONE)
  3. クラスパスを Aether で解決 (DONE)
  4. 上記を別の「コンテナー」にバンドルします (バージョンが競合する可能性のある異なる Maven 依存関係を使用できるようにするため)。
  5. 他のリストで繰り返します。

いくつかのコンテキストを提供するには、UIMA のコンテキストで上記を使用して、異なるバージョンの異なるライブラリ セットに依存する異なる (自然言語処理) パイプラインを実行できるようにしたいと考えています。私の目標は、RESTful な方法で呼び出すことができる (Maven) 依存関係とパイ​​プラインを定義する注釈サーバーを作成することです。パイプライン (およびそれに対応する依存関係) は、(クラスパスの衝突を避けるために) 含まれるクラスパス環境でそれぞれ実行する必要があります。

OSGi は進むべき道ですか? クラスパス (:= 解決済みの jar のリスト) に基づいて、OSGi バンドルをビルドしてデプロイできますか? すべてプログラムで?私は Maven の依存関係を制御できません (それらは UIMA コンポーネントです、それだけです)。そこに OSGi メタデータを追加する方法はありません。

4

4 に答える 4

1

jar のリストを含むバンドルを作成し、それらすべてをバンドルの独自のクラスパスに配置して、そのバンドルを OSGi コンテナーにデプロイすることができます。おそらく、BundleActivator を作成する必要があります (従来の Java のメイン メソッドと同様に、バンドルのエントリ ポイントです)。

次に、そのようなバンドルが複数あると言いましたが、各バンドルを個別のコンテナーにデプロイしたいということを正しく理解していますか? その場合、ある種の REST ライブラリを使用して各バンドルに REST エンドポイントを提供するか、OSGi リモート サービスを使用して、他のコンテナーで検出できるサービスを公開することができます。

これがあなたの言いたいことかどうかわからないので、OSGiが正しい方法かどうかもわかりません. あなたの説明から、どちらのサービスも使用せず (アプリケーションの一部を互いに分離するため、OSGi を使用する非常に重要な理由)、コンポーネント用に異なるバンドルを作成するつもりもありません (OSGi を使用するもう 1 つの重要な理由)。あなたは、現在「マイクロ サービス」として宣伝されているアーキテクチャ スタイルをほぼ説明しています。もう少し詳しく教えてください。

于 2014-11-03T23:57:07.673 に答える
1

ユースケースに基づいて、Java ServiceLoader APIを調べることをお勧めします。ServiceLoader API を使用すると、インターフェースを定義し、さまざまな自己完結型 JAR からそのインターフェースの実装をロードできます。さまざまなライブラリを独自の jar に構築し、インターフェイスを介して必要なメソッドを公開し、それらを Java プログラムから個別にロードできます。ServiceLoader は、利用可能なさまざまな実装もリストします。

ドキュメントから: サービス タイプ com.example.CodecSet があるとします。これは、あるプロトコルのエンコーダー/デコーダーのペアのセットを表すことを目的としています。この場合、2 つの抽象メソッドを持つ抽象クラスです。

public abstract Encoder getEncoder(String encodingName);
public abstract Decoder getDecoder(String encodingName);

プロバイダが指定されたエンコーディングをサポートしていない場合、各メソッドは適切なオブジェクトまたは null を返します。一般的なプロバイダは、複数のエンコーディングをサポートしています。com.example.impl.StandardCodecs が CodecSet サービスの実装である場合、その jar ファイルには次の名前のファイルも含まれます。

META-INF/services/com.example.CodecSet

このファイルには次の 1 行が含まれています。

com.example.impl.StandardCodecs        # Standard codecs

CodecSet クラスは、初期化時に単一のサービス インスタンスを作成して保存します。

private static ServiceLoader<CodecSet> codecSetLoader
        = ServiceLoader.load(CodecSet.class);

特定のエンコーディング名のエンコーダーを見つけるために、既知の使用可能なプロバイダーを反復処理する静的ファクトリ メソッドを定義し、適切なエンコーダーを見つけた場合、またはプロバイダーが不足している場合にのみ返します。

public static Encoder getEncoder(String encodingName) {
        for (CodecSet cp : codecSetLoader) {
                Encoder enc = cp.getEncoder(encodingName);
                if (enc != null)
                        return enc;
        }
        return null;
}

getDecoder メソッドも同様に定義されます。

于 2014-11-06T03:20:40.573 に答える