2017-08-17 1 views
0

私のローカルMavenキャッシュ(~/.m2/repository/)を見ると、特定のビルド(プロジェクト)にのみ使用される特定の成果物の10-20バージョンがあります。私はこの重複を取り除きたいと思っています(彼らは異なったバージョンですが、依然として依存しているプロジェクトがマイクロまたはマイナーバージョンの違いを許容できると思います)。そして、Mavenに何らかの形で最も近い利用可能なバージョン特定のアーティファクトバージョンがローカルリポジトリに存在しない場合、依存関係の解決中に欠けている依存関係を最も近い利用可能な一致で解決するようにする

私はバージョン1.0.01.1.21.4.0と私のローカルキャッシュにfoo:barアーティファクトの2.0.0を持っている場合たとえば、私がMavenを希望:1.1.0

  • 使用を必要とするビルドの

    • 使用1.1.21.4.0ビルドに必要なもの1.4.10
    • 2.0.0ビルドに必要なもの2.5.0

    特定のビルドのpomを手動で変更する必要はありません。

    私は、適切な分析を行わずに依存関係のバージョンを切り替えることに関連するリスクをかなり認識しており、非クリティカルなビルド(ツール/ライブラリVCSであり、実行して試してみたい)、好ましくは特定のフラグが与えられたときにのみ起動される。

    Mavenの拡張機能やプラグイン(システム全体に適用でき、必要に応じてフラグを付けることができます)のように、私の目標を達成するのに役立つものがありますか?

    PS:「最も近い」の定義は(Mavenのは、それらの間にある実際のリリースバージョンに応じて、1.5.0に近い1.4.02.0.0のか分からないかもしれないという事実を与えられた)あいまいな可能性がありますので、それも十分であろうビルドコマンドでバージョンを指定できる場合は(mvn package -Dfoo:bar=1.4.0など)、マニュアルを変更せずにpomを変更してください。 (これは既に<properties>のエントリとして指定されたバージョンでは可能ですが、推移的な依存関係のハードコーディングされたバージョンでさえオーバーライドできる一般的な解決策が必要です。 )は、私によって作成されたものではないので、実際にはpomファイルに対して制御権を持っていません。私が探しているのは、ソースレベルでの手動修正を行わずに、pomファイルの依存関係のバージョンを上書きする方法です。

  • +0

    mavenのバージョンは範囲にすることができます。 [POMの参考文献](https://maven.apache.org/pom.html)のセクション "Dependency Version Requirement Specification"を読んでいますか? –

    +0

    @PaulHicksありがとうございます。しかし、私は 'pom'が私によって構成されていない任意のライブラリ(VCSからクローンしたものなど)をビルドすることを指しています。 )。 Btw申し訳ありませんが、 "ペットのプロジェクト"という言葉が間違っている場合、私はそれを削除します:) –

    +0

    これはdependencyManagementの目的です。あなたのpomはあなたが受け入れるバージョン/バージョンの範囲を定義します。サードパーティのPOMが第4(?)パーティのpom(バージョン1.2)に依存している場合は、そのプロジェクトの一時的な依存関係を親pomから除外し、正しいバージョンまたはバージョンの範囲を自分自身で含めることができます。私は、5.0.0-RC2を使用しているときに、JUnit 4.12に依存しているプロジェクトのために常にそれを行います... –

    答えて

    1

    推移的依存関係を変更するには、直接依存関係の推移的依存関係を除外してから、直接依存関係を追加する必要があります。

    たとえば、foo.jar(xyz.jarバージョン1.3に依存)とbar.jar(xyz.jarバージョン1.4に依存)に依存する場合、これら2つのセクションをpom:

    <!-- Define the version(s) that you allow your dependencies to depend on. --> 
    <dependencyManagement> 
        <dependency> 
        <groupId>projectXyz</groupId> 
        <artifactId>xyz</artifactId> 
        <version>[1.0,2.0)</version> 
        </dependency> 
        <dependency> 
        <groupId>projectFoo</groupId> 
        <artifactId>foo</artifactId> 
        <version>1</version> 
        <exclusions> 
         <exclusion> 
         <groupId>projectXyz</groupId> 
         <artifactId>xyz</artifactId> 
         </exclusion> 
        </exclusions> 
        </dependency> 
        <dependency> 
        <groupId>projectBar</groupId> 
        <artifactId>bar</artifactId> 
        <version>5</version> 
        <exclusions> 
         <exclusion> 
         <groupId>projectXyz</groupId> 
         <artifactId>xyz</artifactId> 
         </exclusion> 
        </exclusions> 
        </dependency> 
    </dependencyManagement> 
    ... 
    <!-- Declare your dependencies but don't allow them to suck in their transitive dependencies. --> 
    <dependencies> 
        <dependency> 
        <groupId>projectXyz</groupId> 
        <artifactId>xyz</artifactId> 
        </dependency> 
        <dependency> 
        <groupId>projectFoo</groupId> 
        <artifactId>foo</artifactId> 
        </dependency> 
        <dependency> 
        <groupId>projectBar</groupId> 
        <artifactId>bar</artifactId> 
        </dependency> 
    </dependencies> 
    ... 
    

    これはできる限り最新のバージョンのxyz.jarを選択します。これは使用される唯一のバージョンです。 fooとbarがxyzを使用すると、プロジェクトに許可されているバージョンが表示されます。

    最もよく行うべきことは、よく定義されてよく管理されているdependencyManagementセクションのparent pom(またはbom:部品表)を使用することです。すべてのプロジェクトの間に「すべて」を共有するだけで、すべてのバージョンを1つにまとめることができます。必要に応じてプロジェクトのバージョンを上書きすることができます。

    各プロジェクトでバージョンを定義する場合は、version rangesが有効です。

    • [1.1.0、1.2)
    • [1.4.0、1.5)
    • [2.0.0、)
    :あなたが与えた3例については、次のようなものを使用します

    (ここで補正にオープン..私はバージョンを使用していない、ほぼ10年の範囲である。)

    最後に、それはすでに利用可能なバージョンを使用して取得ではなく、最高のものをダウンロードするには、次のことができ、すべてのそうですlocal artifact repositoryを中央メインリポジトリとして使用し、turn off access to maven central and bintrayを使用します。

    +0

    は、私は疑う( '1.1.0' - >' 1.1.2'など)、私は理解していればMavenはまだ(ローカルリポジトリに1.1.0' 'を探しますので、正しく)他の利用可能なバージョンを試してみるのではなく、見つからなければ失敗しますか? –

    +0

    はい、あなたのバージョンが(その後、あなたはすべてのプロジェクトを修正するために一つだけのファイルを更新する必要があるため)私は親ポンポン/ BOMソリューションをお勧めする理由である、期日までの範囲に保つ必要があります。あなたの依存関係/ dependencyManagement範囲は)[1.1.0,1.2であれば、Mavenは1.1.0に優先して1.1.2を選択します。 –

    0

    私がこれまでに見つかった最も近いもの:https://github.com/jboss/maven-dependency-management-extension/blob/master/README.md

    をそれは、例えば、特定の依存関係のバージョンを上書きするために${MAVEN_HOME}/lib/extに滴下して利用することができますがmvn install -Dversion:junit:junit=4.10。提案された「インテリジェントなバージョン導出」手法は提供されていませんが、それは十分な解決策です。

    関連する問題