3

Bundle-Classpath にいくつかの jar を配置しました。以下の行は、Felix プラグインを使用してバンドル用の manigest.mf を作成する pom.xml のエントリを示しています。

<Bundle-ClassPath>.,lib/com.springsource.org.h2-1.0.71.jar,lib/com.springsource.org.apache.lucene-2.3.2.jar,lib/com.springsource.org.apache.lucene.search-2.3.2.jar</Bundle-ClassPath>

これらの jar にはパッケージをインポートするクラスがありますが、私が見る限り、すべて MANIFEST.MF があり、これには Import-Package ステートメントの独自の (正確な) リストがあります。

ただし、(Maven とバンドル プラグインを使用して) プロジェクトをビルドすると、特定のクラスへの参照を解決できないため、エラーが報告されます。具体的には、エラーは次のとおりです。

Unresolved references to [com.sun.tools.javac, javax.naming, javax.naming.spi, javax.servlet, javax.servlet.http, javax.sql, javax.transaction.xa]

これらのエラーはすべて com.springsource.org.h2-1.0.71.jar から発生し、これらのパッケージはすべてその jar のマニフェストにインポートされます。

理解できません:

  • これらのパッケージが com.springsource.org.h2-1.0.71.jar の MANIFEST>MF に既にインポートされている場合、Maven バンドル プラグインが不平を言うのはなぜですか
  • 問題が com.springsource.org.h2-1.0.71.jar からのみ発生するのはなぜですか? com.springsource.org.apache.lucene.search-2.3.2.jar には MANIFEST.MF に Import-Package のエントリもいくつかありますが、その特定の jar を削除しようとすると、ビルドは正常に完了しますか?

2点目については、調べてみたところ、パターンがあるような気がします。com.springsource.org.apache.lucene.search-2.3.2.jar がそのマニフェストで指定するすべてのインポートは、同じく指定されている com.springsource.org.apache.lucene-2.3.2.jar によって満たされています。 Bundle-Classpath で。

com.springsource.org.apache.lucene-2.3.2.jar (Bundle-Classpath 上にある) によって満たされている com.springsource.org.h2-1.0.71.jar の依存関係は、ただし、エラー メッセージには、Bundle-Classpath の jar によって満たされない依存関係がエラー メッセージにリストされています。

何が起こっているのかよくわかりません。Bundle-Classpath で指定される jar ファイルに関するルールは何ですか? マニフェストのインポート (Import-Package で指定されている場合でも) 要素は、メイン プロジェクトの pom にリストする必要がありますか? それとも、これはMavenバンドルプラグインが強制しているものですか? 後者の場合、強制から逃れる方法はありますか?

4

2 に答える 2

2

Bundle-Classpath で指定された jar ファイルに関するルール ?

bundle-classpath にリストされているファイルは、maven-bundle-plugin(mbp) によってスキャンされ、指定された各 jar に必要なインポートが識別されます。これにより、mbp は必要なインポートをメイン (メイン バンドル) の manifest.mf に追加します。これは、パッケージが外部バンドルによってエクスポートされる必要があることを意味します。必要なパッケージがバンドルの外に見つからない場合、バンドルは開始されません。

アプリケーションで必要なサードパーティの jar を使用するには、2 つのソリューションがあります。

  1. すべてのサードパーティ jar の OSGi バンドルを準備します。spring jar およびその他のオープン ソース プロジェクト用に既に作成されている osgi バンドルは、こちらの spring リポジトリにあります。完璧に検索するだけです。あなたはそれを見つけるでしょう。

  2. Bundle-classpath を使用します。これにより、サードパーティの依存関係 (および「すべて」の推移的な依存関係) をバンドルに入れ、Bundle-ClassPath ヘッダーで各 jar を指定する必要があります。この場合、mbp はバンドル クラスパス jar を分析し、インポート パッケージ ヘッダーをいじろうとします。pom.xml にカスタム ヘッダーを含めることで、これを回避できます。カスタムの import-package を選択する場合は、他の (外部の) バンドルから必要なパッケージを import-package に正しく含めるように注意してください。

経験則 : アプリが bundle-classpath で何かを見つけた場合、そのアプリは import-package に移動しません。

于 2013-06-05T10:07:54.813 に答える