2

モジュールが依存関係を共有するマルチモジュールmavenプロジェクトがあります。共有とは、同じ依存関係を使用することを意味します。ただし、各モジュールは依存関係自体を宣言します。健全性を維持し (ええ、maven、健全性、私は知っています)、すべてのモジュールが同じバージョンの依存関係を使用するようにするために、親 pom はバージョン番号でプロパティを宣言します。

<properties>
   <dependency1.version>1.0-SNAPSHOT</dependency1.version>
   <dependency2.version>1.1-SNAPSHOT</dependency2.version>
</properties>

そしてすべてのモジュールはそれを次のように使用します:

<dependency>
  <groupId>group</groupId>
  <artifactId>dependency1</artifactId>
  <version>${dependency1.version}</version>
</dependency>

依存関係のバージョンを 1 か所で変更できるので、このセットアップには非常に満足しています。

今、私は自分で維持している依存関係をたくさん持っています。それらのリリースは自動で非常に簡単です。基本的には次のとおりです。

mvn release:prepare release:perform -B

今、私はさらに自動化したいと思っており、メインプロジェクトで実行しています:

mvn versions:update-properties

(基本的に、「mvn versions:use-releases」も実行して、必要に応じて通常の依存関係を変更しますが、この質問の範囲外です)。

この update-properties の実行後、メイン プロジェクト pom のプロパティはリリースを指します (これは良いことです)。ただし、モジュールがプロパティを使用して他の依存関係のバージョンを定義し、それらのプロジェクトでより新しいバージョンが利用可能である場合、それらのプロパティも変更されます。

update-properties によるダメージを制限する方法はありますか? versions:use-release はincludesプロパティを使用するため、私のアーティファクトでのみ使用できます。update-properties に類似したものは見つかりません。

親以外のすべての pom を元に戻し、それだけをコミット/プッシュできますが、エレガントに見えません。

4

1 に答える 1

2

Mavenの概念を理解していなかったようです。このような状況では、次のように親pomでdependencyManagementを使用する必要があります。

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.google.inject</groupId>
      <artifactId>guice</artifactId>
      <version>3.0</version>
    </dependency>
    ...
   </dependencies>
</dependencyManagement>

モジュールでは、次のような依存関係を使用します。

  <dependencies>
    <dependency>
      <groupId>com.google.inject</groupId>
      <artifactId>guice</artifactId>
    </dependency>
    ...
   </dependencies>

重要なステップは、バージョンを定義しないことです。この場合、依存関係管理ブロックによって定義されたバージョンが使用されます。したがって、プロパティなどを定義する必要はありません。さらに、特定のバージョンの依存関係を定義および変更できる単一のポイントがあります。

それとは別に、version:update-properties呼び出しのコマンドラインでそれを定義して変更されるプロパティを制限することが可能です。

于 2012-12-11T18:47:43.980 に答える