依存関係の解決は、Tychoの2段階のプロセスです。
最初に、Tychoはいわゆるターゲットプラットフォームを計算します。これは、依存関係の解決のために考慮されるアーティファクトのセットです。このステップでは、TychoはMavenルールに従ってPOMの依存関係を評価し、その結果をターゲットプラットフォームに追加します。また、ローカルで構築したすべてのTychoアーティファクトがmvn install
ターゲットプラットフォームに追加されます。
次に、Tychoは、OSGiルールに従って、プロジェクトの依存関係(MANIFEST.MF、feature.xmlなどから)を解決します。Mavenの依存関係とは異なり、OSGiの依存関係は通常バージョン範囲として指定されます。だからあなたが書くなら
Require-Bundle: my.bundle;bundle-version="1.2.0"
バージョン1.2.0以降が必要だと言っています。通常、ここで正確なバージョンを指定することは望ましくありません。これは、ランタイムに影響を与えるためです。ただし、ビルド時に何が発生するかを制御する必要があります。そのため、ターゲットプラットフォームのコンテンツを制御するさまざまな方法があります。
特定のケースでは、POMで指定されたバージョンのターゲットプラットフォームにPOMファーストのアーティファクトがあります。次に、TychoアーティファクトへのPOM依存関係も指定しているようです(これは一般的ではありませんが、問題ありません)。そのため、ターゲットプラットフォームで指定されたバージョンのTychoアーティファクトがあります。ただし、を使用してローカルで新しいバージョンのTychoアーティファクトも構築しているためmvn install
、これらもターゲットプラットフォームに含まれます。したがって、依存関係の解決(ステップ2)では、2つのバージョンから選択でき、通常は新しいバージョンが選択されます。
ローカルで構築されたアーティファクトがターゲットプラットフォームに追加されないようにするには、ファイルを削除します~/.m2/repository/.meta/p2-local-metadata.properties
。(これはすでにご存知だと思いますが、念のためです。バグ355367は、0.16.0で代替のより便利なオプションも提供します。)
そして最後に、POMファーストのアーティファクトとTychoアーティファクトの動作が異なる理由について質問します。
複数のTychoアーティファクトが同じリアクター内に一緒に構築されていると仮定します。次に、各アーティファクトは、特定のターゲットプラットフォーム構成を必要とせずに、他のアーティファクトを依存関係として使用できます。たとえば、同じリアクター内のアーティファクトへのPOM依存関係は必要ありません。(つまり、同じリアクターからのアップストリームアーティファクトは自動的にモジュールのターゲットプラットフォームの一部になります。)したがって、Tychoリアクターの一部の再構築をサポートするには(mvn install
フルリアクターの後で)、ローカルにインストールされたTychoアーティファクトが必要です。すべてのモジュールのターゲットプラットフォームに追加されます。Tychoは、それらが元々同じリアクターの一部であったかどうかを知ることができないため、それらすべてを追加するだけです。
POMファーストのアーティファクトの場合、Tychoリアクターの一部のみが構築されている場合でも、アーティファクトへの参照は常に(Maven構成の継承を通じて)存在します。したがって、ローカルで構築されたPOMファーストアーティファクトのバージョンを取得するためのメカニズムは必要ありませんが、Tychoは正確に指定されたバージョンをターゲットプラットフォームに追加できます。