9

私は Eclipse 4 アプリケーションを作成しましたjarが、アプリケーションの一部として機能を提供する必要がありました (これは、log4j簡単にするためなど、何でもかまいません)。プロジェクトのクラスパス ( ) の一部として
追加しましたが、実行時にサービスがエラーで失敗しました (OSGI からだと思いますか?)。 とにかくこれを検索すると、少なくとも私が理解しているように、jarを別の一部として追加し、アプリケーション/サービスからこの新しいプラグインへの依存関係を作成する必要があることがわかりました。 つまり、 を作成しました。 今回は設定がうまくいきました。 したがって、これを理解していれば、Eclipse/OSGi 向けに開発するときは、クラスパスを直接追加するのではなく、プラグインを介して追加する必要があります (なぜですか?)。質問:jarRight Click->Configure Build PathClassNotFound
Plugin
Plugin Project from Existing JAR archives

jars
これまでのところ私が正しければjars、プロジェクトを開発するときに含める標準的な方法は何ですか?
1つを定義/作成し、そこに必要なすべての必要なサードパーティライブラリPlugin Project from existing JAR archivesを追加する、必要に応じて別のプラグインプロジェクトを作成する、おそらく何か他のものを作成しますか??? 私の用語が正確でない場合は申し訳ありません。OSGi および Eclipse プログラミングの初心者です jar

注:私が話しているときjars、他の OSGi サービスについて言及しているわけではありません。これは、アプリケーションの多くの部分で必要となる、すぐに使用できる信頼できるサード パーティ製ライブラリを使用するという規範に言及しています。たとえばlog4j、xml 解析ライブラリapache commonsなど

4

3 に答える 3

5

ランタイムの場合、バンドル クラスパスの内容を制御するのは、常にマニフェストとそこにあるヘッダーです。jar にアクセスするには、次の 3 つの方法があります。

  1. Import-Package ヘッダー。これが推奨される方法です。必要なパッケージごとに 1 つのインポートを定義します。アクセスしたい jar は、バンドルとしてランタイムにデプロイする必要があります。また、必要なすべてのパッケージをエクスポートする必要があります。

  2. バンドルが必要です。これは、バンドルにアクセスする別の方法です。必要なバンドルの ID を定義し、それがエクスポートするすべてのパッケージを表示します。Require-Bundle は他のバンドルにより密接にバインドするため、Import-Package の方法を優先する必要があります。

  3. バンドル クラスパス。これにより、独自のバンドルに埋め込むクラスパスに jar を追加できます。これは、他の方法が機能しない場合の最後の手段にすぎません。これを他のメソッドと混合すると、厄介なクラスローディングの問題が発生する可能性があります。

Maven Central には、ビルド済みのバンドルが多数あります。現在、多くの jar にはすでに OSGi マニフェストが含まれています。これが当てはまらない場合のために、多くの jar が servicemix によってバンドルとして再パッケージ化されます。groupId: org.apache.servicemix.bundles を参照してください。さらにSpringバンドルリポジトリもあります。

以下に、あなたが読みたいかもしれないいくつかのリソースをリストしました:

http://www.aqute.biz/Blog/2007-02-19

http://wiki.osgi.org/wiki/Import-Package

http://wiki.osgi.org/wiki/Require-Bundle

http://www.vogella.com/blog/2009/03/27/required-bundle-import-package/

于 2012-09-25T06:52:19.917 に答える
3

私たちのプロジェクトで直面した問題とまったく同じです。OSGi と互換性のないレガシー jar がいくつかあるため、BundleContent と並行して lib フォルダーを作成し、それをマニフェストのクラスパス セクションに追加しました。

Bundle-ClassPath: .,

 /lib/<legacy jar>.jar

1 つのバンドルのみがパッケージを消費する場合、パッケージを不必要にエクスポートおよびインポートする必要はありません。

于 2012-09-27T06:23:44.747 に答える
3

あなたが言及した例は OSGi バンドルとして入手できるので、自分でバンドルする必要はありません。通常、OSGi では直接の jar 依存関係を使用せず、通常はパッケージまたはバンドルの依存関係を使用します。参照している log4j の例では、複数のバンドル プロバイダー (新しい log4j jar、古い log4j の springsource バンドル バージョン、slf4j 実装など) が存在する可能性があるため、インポート パッケージを使用する必要があります。これにより、コードの依存関係が実際のプロバイダーから切断されます。

これらの依存関係は、プロジェクトのクラスパスではなく、マニフェストを介して維持されます。Eclipse プラグイン プロジェクトでは、プロジェクト ビルド クラスパスはマニフェストのエントリから派生します。

サービスを使用していない場合でも、すべてのコードの依存関係はマニフェストを介して維持されます。

于 2012-09-24T17:09:36.220 に答える