2009-08-12 6 views
2

私は自分のアプリケーションに既製のOSGiバンドルをいくつか使用しています。まだOSGi互換ではない追加のパッケージと共に新しいバンドルに再パッケージしたいと思います。複数のOSGiバンドルをBND/Maven-BNDプラグインとマージするにはどうしたらいいですか?

ケースインポイントは、いくつかのOSGiバンドルとして利用可能なEclipseLinkです。ほとんどのものはオプションで、実行する内容によって異なります。私は、関連するバンドルを選び、データベースドライバ(MySQl JDBCコネクタなど)を追加し、それらを展開しやすい新しいバンドルに再パッケージしたいと思います。

Apache Felixのmaven-bundle-pluginを使用しています。私は、ソースコードなしで新しいMavenプロジェクトをセットアップ依存関係として4つのEclipseLinkとMySQLコネクタを追加し、次のことを試してみました:

  • は1バンドル内のすべての依存関係を含めるように<Embed-Dependency><Embed-Transitive>命令を使用します。問題:プラグインがマニフェストを書き換えるときに、eclipselinkバンドル(たとえば、javax.mail.internet)からのオプションの依存関係が必要になります。元のバンドルには、マニフェストに「resolution = optional」が含まれているため、うまく動作しません。
  • プラグインのmanifestゴールを使用してください。これは基本的に同じ結果をもたらします。
  • は、プラグインの目標をbundleallとしました。これは別のバンドルを再度作成するため、私が望むものではありません。さらに悪いことに、これらのバンドルは内部に依存関係が存在しないためです。

私はこのことについて強迫観念になるだろう、とだけ別のサードパーティ製の束の全体の束と一緒に行くが、私はより多くのそれらをパッケージ化することができた場合ではないよStrutsの2と同様の問題に直面するつもりですきれいに、私は本当にしたいです。私は、OSGiのポイントがモジュール性であることを知っています。大きなバンドルを作成することはそれを打ち負かしてしまいますが、あなたのモジュールが緊密に結合されていれば、それらを単一のバンドルに入れることもできます。

もちろん、私はマニフェストを手動で調整することができますが、間違いなく欲しいと思います。

+0

明確にするために、一連のOSGiバンドルと他のjarファイルのクラス、リソース、およびマニフェストの内容を1つにマージしたいとしますか? OSGi以外のjarファイルからも型を公開する必要がありますか? –

+0

OSGiの一般原則と違うのですか?なぜ、バンドルされていないjarファイルをOSGifyしないで(やはりbndとmavenを使って)、組み込み依存ファイルではなく適切なバンドル依存ファイルとして使用してください。基本的には、すべてをバンドルに変換します。 – omerkudat

+0

@リーチ売り手:うん、それは正しいです。実際には、私は元のバンドルよりもずっと少なくする必要があり、通常はOSGi以外のjarファイルからパッケージを1つだけ必要とします。たとえば、eclipselinkとdbドライバを1つのバンドルにまとめると、実際にはorg.eclipse.persistence.jpaをエクスポートするだけで、他のすべてはバンドル内で実行されます。 –

答えて

2

omerkudatによると、これはおそらく奨励するのは良い習慣ではないが、あなたの理由があるので、これは貧しい人のマージを行う方法である。

自分でOSGiマニフェストを処理すると仮定すると、パッケージフェーズの前に、すべてのクラスをバンドルとjarファイルからtarget/classesディレクトリに移動する必要があります。

これは、依存関係プラグインのアンパック依存関係またはアンパックのいずれかの目的で実行できます。私はアンパック依存関係を使用して、すべてのプロジェクト依存関係(または特定の名前付けパターンまたは特定のgroupIdに続くもの)を処理したい場合や、アンパック対象の成果物を細かく制御したい場合はアンパック目標を使用します。冗長なPOMの費用)。私は私の例で解凍すると仮定します。各アンパックは、プロジェクトのoutputDirectory(つまり、ターゲット/クラス)に出力されます。

は、ダウンロードされた順序で各パッケージの重複成果物を上書きします。ので、マニフェストが互いに壊れてしまいます。あなたのアーティファクトが正しく管理されるように、私はあなたのsrc/main/resourcesがアンパックされたコンテンツの上にコピーされ、上書きされないようにアンパックゴールを初期段階にバインドします。下のサンプルでは、​​の生成リソースです。ローカルコンパイル後に発生します。あなたはクラスのいずれかを上書きする必要がある場合は、そのようなどの依存関係を展開するために、以前のフェーズを使用し生成し、ソースを以下

私のサンプルはちょうど最初のjunit-3.8.1の内容をアンパックしコモンズ-IO 1.4(プロジェクトのリソースがそこにコピーされる前に、ターゲット/クラスに宣言した2つの依存関係)。バージョンは私の依存関係のセクションで定義されていることに注意してください。依存関係としてバンドル/ jarsを宣言していない場合は、artifactItemでバージョンを宣言する必要があります。

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
    <execution> 
     <id>unpack</id> 
     <phase>generate-resources</phase> 
     <goals> 
     <goal>unpack</goal> 
     </goals> 
     <configuration> 
     <artifactItems> 
      <artifactItem> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <overWrite>false</overWrite> 
      <outputDirectory>${project.build.outputDirectory}</outputDirectory> 
      </artifactItem> 
      <artifactItem> 
      <groupId>commons-io</groupId> 
      <artifactId>commons-io</artifactId> 
      <overWrite>false</overWrite> 
      <outputDirectory>${project.build.outputDirectory}</outputDirectory> 
      </artifactItem> 
     </artifactItems> 
     <overWriteReleases>false</overWriteReleases> 
     <overWriteSnapshots>true</overWriteSnapshots> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
+0

Hm、OK、これはうまくいく可能性があります。ありがとう。正確には美しいものではありませんが、私はそれが私の求めるものだと思います。 –

+0

すべての依存関係をバンドルする必要がある場合は、unpack-dependenciesゴールを代わりに使用できます(http://maven.apache.org/plugins/maven-dependency-plugin/examples/unpacking-project-dependencies.html)。これはあまり醜い構成を含みますが、それはまだハックです –

関連する問題