3

Maven プロジェクトでは、範囲内の任意のバージョンを許可する別のアーティファクト (spring-core) に依存するサードパーティのアーティファクト (具体的には spring-data-jpa 1.1.0.RELEASE) を使用しました (正確には: [3.0.7] .RELEASE,4.0.0.RELEASE)、その pom-fileを参照してください)。spring-core に直接依存することはありませんでした。

ある日、私たちのビルドは 3.1.2.RELEASE を選択しましたが、3.2.0.RC1 がリリースされたとき、私たちのビルドは突然そのバージョンを選択しました。

ただし、反復可能なビルドが必要です: 1 年後にパッチを配信する場合、少なくともそれを知らずに、更新されたバージョンの spring-core やその他の間接的な依存関係を取り込みたくありません。

(たとえば、 を使用して、Spring-Core の特定のバージョンを 1 つ選択するように Maven を誘導できることはわかっています<dependencyManagement>が、ここでのポイントは、間接的な依存関係に任意の選択肢が隠されている可能性があるということです。Maven にそれらについて教えてもらいたいのですが、これを手動で定期的にチェックする必要はありません。)

質問:間接的な依存関係に対して任意のバージョンを選択した場合、Maven に警告させるにはどうすればよいですか?

4

1 に答える 1

2

あなたが発見したように、バージョン範囲は悪です。

本当の問題は、バージョン範囲が人々を誘惑して良いアイデアだと思わせるサイレンであるということです。

バージョン範囲は、開発者が一連のバージョンから必要なバージョンを選択できるようにするためのヒントと見なす必要があります。

Maven の間違いは、バージョン範囲をpom.xml含むアーティファクトを公開できるようにするために、そもそもバージョン範囲を 内で定義できるようにしたことです。

バージョン範囲を使用する推移的な依存関係を持つアーティファクトに依存すると、ビルドの問題を解決する方法は実際には 2 つしかありません (1 つは 2 番目のより洗練されたバージョンです)。

  1. 推移的な依存関係に独自の依存関係を追加しますが、範囲の代わりに固定されたバージョンを使用します...例

    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-jpa</artifactId>
      <version>1.1.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>3.1.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>3.1.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>3.1.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>3.1.2.RELEASE</version>
      <exclusions>
        <exclusion>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    

    <optional>true</optional>依存関係は推移的ではないため、依存関係をリストする必要はありません。<scope>provided</scope>同様に、同じ理由で依存関係をリストする必要もありません。

  2. 上記と同様ですが、最初に依存関係に除外を追加することでより安全になります。

    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-jpa</artifactId>
      <version>1.1.0.RELEASE</version>
      <exclusions>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-orm</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-tx</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>3.1.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>3.1.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>3.1.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>3.1.2.RELEASE</version>
      <exclusions>
        <exclusion>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    

この 2 つのうち、私は後者を好みます。なぜなら、これらの依存関係が明示的に言及されている理由について、少なくとも人々にヒントを与えるからです。

したがって、元の質問に戻るには、要点は、pom.xml.

spring-data-jpa:1.1.1.RELEASE座標が異なる完全に異なる推移的な依存関係ツリーがある場合は、バージョンを更新するために を編集しているときに、推移性もpom.xml修正する必要があります。

私の知る限り、現在、必要なものの検証をサポートするエンフォーサ ルールはありません。

次のようなエンフォーサ ルールを作成することをお勧めします。ensureTransitiveVersionRangesArePinned

そのルールは次のことを行う必要があります。

  • プロジェクトの依存関係のリストをスキャンする
  • 各プロジェクトの依存関係によって提供される推移的な依存関係を計算します
  • これらの推移的な依存関係のいずれかがバージョン範囲である場合
    • exclusionその推移的な依存関係があることを検証します
    • 直接的なプロジェクトの依存関係として固定された推移的な依存関係のバージョンがあることを検証します (別の GAV にある同等のアーティファクトを追加している可能性があるため、固定されたバージョンがなくても失敗ではない可能性があります。依存関係)... いずれにせよ、依存関係が追加されていない場合、ほとんどの場合、単体テストは CNFE をトリガーすることによってそれをキャッチする必要があるため、このチェックは厳密には必須ではありませんが、おそらく警告を出力する必要があります。

実際に推移的な依存関係を除外していることを確認するツールがあるかどうか思い出せない<exclusions>ので、調査する必要があるかもしれません。

于 2013-04-30T09:44:20.633 に答える