2

NetBeans プラットフォーム全体を使用せずに NetBeans Lookup API を使用することが当店にとって適切かどうかを評価しようとしています。

これまでのところ、このコードでプロジェクトを作成することができました:

 for (SomeInterface si : Lookup.getDefault().lookupAll(SomeInterface.class)) {
     si.doSomething();
 }

また、いくつかの他のプロジェクトを作成しました。それぞれに SomeInterface を実装する AnImplementation クラスと、クラスを参照する行を含む付随ファイル META-INF/services/path.to.SomeInterface があります (例: "other.path.to.AnImplementation")。 )。

これらの実装プロジェクトを NetBeans IDE のメイン プロジェクトのライブラリ (依存関係) に追加すると、問題なく動作し、両方の実装からの doSomething() の連続した結果を確認できます。

私の質問は、メイン プロジェクトのサブプロジェクトを参照せずにそれを機能させる方法です。サブプロジェクトのjarは、ビルド時にメインプロジェクトの生成されたjarに含まれず、自由に追加または削除して、上記のコードの結果を変更できます。

私が間違っていなければ、これはルックアップ API のドキュメントで宣伝されている動作です。前もって感謝します。

編集: 今のところ、私の結論は、NetBeans プラットフォーム (または OSGi ?) がなければ、起動時にどのサービス プロバイダが存在するかを検出できないということです。クラスパスでそれらの jar を参照する必要があるため、起動前にそれらを識別する必要があります。私が間違っていることを証明してください。

4

2 に答える 2

4

呼び出し側アプリケーションでサブプロジェクトを参照する必要があります。これにより、サブプロジェクトがクラスパスに配置されます。jar/library がクラスパスにない場合、Lookup や ServiceLoader などの API はそれを見つけることができません。

OSGI または NetBeans プラットフォームを使用している場合、これらのシステムを使用すると、実行時にクラスパスを変更できます。

Geertjans のブログには、まさにこれ (NetBeans プラットフォームの外部で Lookup API を使用) に関するエントリがあり、彼のブログでは、ServiceLoader と Lookup API を対比するJohn O'Connors のブログも参照しています。

編集

同様の質問に対するJon Skeets の回答を見たところです。プロパティを使用して、クラスパスの jar を検索する場所としてフォルダー (この場合は「libs」) を設定できます。-Djava.ext.dirs=lib

于 2011-05-31T07:43:34.227 に答える
1

私の理解では、これを機能させるために、すべてのモジュールをメインプロジェクトと一緒にバンドルする必要はありません。Lookupグローバルは内部でServiceLoaderメカニズムを使用するため、必要なのは、アプリケーションを開始するときにモジュールがクラスパス上にあることを確認することだけです。あなたの質問に基づいて、私は次のことを検討することをお勧めします

  • ServiceLoaderを直接使用する方が、問題や
  • GuiceのようないくつかのDIフレームワークは試してみる価値がありますまたは
  • OSGIがあなたにも役立つ何かを提供し、それを使用する場合。

誤解しないでください。私はNetBeansとNetBeansプラットフォームが大好きですが、Lookup上記の可能性があるため、単独で使用することは限られた用途であると私は考えています。

于 2011-05-30T21:54:12.020 に答える