5

次のシナリオを考えてみましょう。私のアプリケーションには、自分のPOMファーストアーティファクト(純粋なMavenで構築)への依存関係と、自分のマニフェストファーストアーティファクト(Tychoで構築)への依存関係があります。POMファーストのアーティファクトの場合、TychoはPOMで指定したバージョンとまったく同じものを解決します。マニフェストファーストのアーティファクトの場合、Tychoは、より高いバージョンを持つ可能性のあるローカルに構築されたユニットを解決します。

具体的なケースでは、pom.xmlでバージョン1.2.0のmanifest-firstアーティファクトへの依存関係を指定しましたが、バージョン1.3.0.2012xxxでは「プロジェクトの依存関係を解決するために次のローカルで構築されたユニットが使用されました」という警告が表示されます。 。

私はすでに以下のバグと議論を見つけましたが、POMファーストとマニフェストファーストの依存関係を解決するTychoに違いがある理由がわかりません。

4

2 に答える 2

8

依存関係の解決は、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は正確に指定されたバージョンをターゲットプラットフォームに追加できます。

于 2012-09-10T12:05:56.867 に答える
3

ターゲットプラットフォームを解決するときにtychoにローカルアーティファクトを無視させることに関心がある場合は、例のようにCLI tycho.localArtifacts=ignoreを追加します。

mvn clean install -Dtycho.localArtifacts=ignore

詳細については、Tycho-TargetEclipseWikiを参照してください。

于 2016-07-19T07:42:46.253 に答える