web-dev-qa-db-ja.com

Mavenプロジェクトバージョンの継承-親バージョンを指定する必要がありますか?

2つのプロジェクトがあります。親プロジェクト:A、サブプロジェクト:B

A/pom.xml:

<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>pom</packaging>

そして、B/pom.xmlには次のものがあります。

    <parent>
        <groupId>com.dummy.bla</groupId>
        <artifactId>parent</artifactId>
        <version>0.1-SNAPSHOT</version>     
    </parent>

    <groupId>com.dummy.bla.sub</groupId>
    <artifactId>kid</artifactId>

Bに親からバージョンを継承させたいので、私の場合、0.1-SNAPSHOTを配置する必要があるのはA/pom.xmlだけです。しかし、親セクションの下の<version>0.1-SNAPSHOT</version>からB/pom.xmlを削除すると、mavenは親の欠落バージョンについて不平を言います。

${project.version}またはこのようなものを使用して、両方のpomsで01.-SNAPSHOTを使用しないようにする方法はありますか?

152
Shengjie

EDIT:Maven 3.5.0以降、${revision}プレースホルダーを使用したこれに対する素晴らしい解決策があります。詳細については、 FrVaBeの答え を参照してください。以前のバージョンのMavenについては、以下の元の回答を参照してください。


いいえ、ありません。常に親のバージョンを指定する必要があります。幸いなことに、ほとんどの場合に望ましいモジュールのバージョンとして継承されます。さらに、この親のバージョン宣言はMavenリリースプラグインによって自動的にバンプされるため、実際には、バージョンをリリースまたはバンピングするためにMavenリリースプラグインを使用する限り、2か所にバージョンがあることは問題ではありません。

この振る舞いは実際にはかなり問題なく、必要な柔軟性を提供する場合があることに注意してください。以前の親のバージョンの一部を使用して継承したい場合もありますが、それは主流ではありません。

65

Mavenはそのように動作するようには設計されていませんが、この目標を達成するための回避策が存在します(副作用がある場合は、試してみる必要があります)。コツは、純粋なMaven座標ではなく相対パスで親を見つけるように子プロジェクトに指示し、さらにプロパティでバージョン番号を外部化することです:

親ポン

<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>${global.version}</version>
<packaging>pom</packaging>

<properties>
   <!-- Unique entry point for version number management --> 
   <global.version>0.1-SNAPSHOT</global.version>
</properties>

子ポン

<parent>
   <groupId>com.dummy.bla</groupId>
   <artifactId>parent</artifactId>
   <version>${global.version}</version>
   <relativePath>..</relativePath>    
</parent>

<groupId>com.dummy.bla.sub</groupId>
<artifactId>kid</artifactId>

私のプロジェクトの1つでこのトリックをしばらく使用しましたが、mavenがビルドの開始時に多くの警告をログに記録するという事実を除き、特に問題はありませんでした。

編集

Maven 3.0.4では、このような構成はもう許可されていないようです。

80
Yanflea

バージョンIMOを更新する最も簡単な方法:

$ mvn versions:set -DgenerateBackupPoms=false

(ルート/親pomフォルダーで行います)。

POMが解析され、設定するバージョンを尋ねられます。

71
pai

Maven 3.5.0以降では、${revision}プレースホルダーを使用できます。使用方法は Maven CI Friendly Versions に記載されています。

要するに、parent pomは次のようになります(Apacheドキュメントから引用):

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.Apache</groupId>
    <artifactId>Apache</artifactId>
    <version>18</version>
  </parent>
  <groupId>org.Apache.maven.ci</groupId>
  <artifactId>ci-parent</artifactId>
  <name>First CI Friendly</name>
  <version>${revision}</version>
  ...
  <properties>
    <revision>1.0.0-SNAPSHOT</revision>
  </properties>
  <modules>
    <module>child1</module>
    ..
  </modules>
</project>

そして、このような子ポンポン

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.Apache.maven.ci</groupId>
    <artifactId>ci-parent</artifactId>
    <version>${revision}</version>
  </parent>
  <groupId>org.Apache.maven.ci</groupId>
  <artifactId>ci-child</artifactId>
   ...
</project>

また、を使用して Flatten Mavenプラグイン を使用し、デプロイ用に含まれる専用バージョン番号でpomドキュメントを生成します。 HowToは、リンクされたドキュメントに記載されています。

また、@ khmarbaiseは、この機能に関する素敵なblob投稿を書いています。 Maven:バージョンのないPOMファイル?

32
FrVaBe

Yanfleaが述べたように、これを回避する方法があります。

Maven .5.では、次の方法で親プロジェクトからバージョンを転送できます。

親POM.xml

<project ...>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mydomain</groupId>
    <artifactId>myprojectparent</artifactId>
    <packaging>pom</packaging>
    <version>${myversion}</version>
    <name>MyProjectParent</name>

    <properties>
        <myversion>0.1-SNAPSHOT</myversion>
    </properties>

    <modules>
        <module>modulefolder</module>
    </modules>
    ...
</project>

モジュールPOM.xml

<project ...>
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.mydomain</groupId>
        <artifactId>myprojectmodule</artifactId>
        <version>${myversion}</version> <!-- This still needs to be set, but you can use properties from parent -->
    </parent>

    <groupId>se.car_o_liner</groupId>
    <artifactId>vinno</artifactId>
    <packaging>war</packaging>
    <name>Vinno</name>
    <!-- Note that there's no version specified; it's inherited from parent -->
    ...
</project>

myversionは、予約済みプロパティではない任意の名前に自由に変更できます。

17
eFox

以下も使用できます。

$ mvn release:update-versions -DdevelopmentVersion={version}

pOMのバージョン番号を更新します。

16
Jerry Jin

eFoxの回答は単一のプロジェクトで機能しましたが、別のモジュールからモジュールを参照しているときは機能しませんでした(pom.xmlはバージョンではなく、プロパティで.m2に保存されていました)。

ただし、プロパティではなく、正しいバージョンでpomsを生成するため、flatten-maven-pluginと組み合わせると機能します。

プラグイン定義で変更した唯一のオプションはoutputDirectoryです。デフォルトでは空ですが、.gitignore設定で設定されているtargetに設定することを好みます。

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>flatten-maven-plugin</artifactId>
   <version>1.0.1</version>
   <configuration>
      <updatePomFile>true</updatePomFile>
      <outputDirectory>target</outputDirectory>
   </configuration>
   <executions>
      <execution>
         <id>flatten</id>
         <phase>process-resources</phase>
         <goals>
            <goal>flatten</goal>
         </goals>
      </execution>
   </executions>
</plugin>

プラグイン構成はparent pom.xml

6
LeoLozes