17

http://maven.apache.org/pom.html#Propertiesによると、プロパティは「POM内のどこからでも値にアクセスできます」とのことです。

これは「 POM内のほとんどの場所でアクセス可能」と読む必要がありますか?

次のように、依存関係のバージョンを問題なく指定できます。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
</dependency>

しかし、プロジェクト自体のバージョンはどうでしょうか。

<project xmlns="http://maven.apache.org/POM/4.0.0" ...>

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>${myversion}</version>

    <properties>
        <myversion>8</myversion>
    </properties>

    <modules>
        <module>alpha</module>
        <module>beta</module>
    </modules>
    ...

これを試してみると、<version>の値は8になりません。ここではpomで$ {myversion}を定義しましたが、コマンドラインで-Dmyversion=8を指定した場合も同じように見えます。

モジュールの1つが、次のようにハードコードされたバージョン番号でその親を指定する場合:

<parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>8</version>
</parent>

ビルドしようとすると、Mavenがモジュールのpomを確認すると、バージョン8で指定された親pomが見つからないと表示されます。

ただし、$ {myversion}を使用するのではなく、親のバージョンも8にハードコーディングすると、すべてが正常に機能します。

したがって、親pomの/ project/versionタグのプロパティ置換は発生しないように思われます。

これは事実ですか、それとも私が見ているように見えるものについて他の説明がありますか?

よろしく、

/ジョージ

4

1 に答える 1

31

Maven 2.xの設計では/project/parent/(groupId|artifactId|version)、プロパティの置換は許可されていません。/project/(groupId|artifactId|version)

したがって、ルールは次のとおりです。

  • project/version最上位の要素にバージョンをハードコーディングします。
  • project/parent/version子の要素にバージョンをハードコーディングします。
  • オーバーライドしたい場合を除いて、子はバージョンを継承します
    • ${myversion}したがって、プロパティは必要ありません
  • モジュール間の依存関係に使用${project.groupId}します。${project.version}

このトピックに関するスレッドはmavenユーザーリストに無数にあり(たとえば、Pom Parent Version Propertiesを参照)、上記のルールを回避しようとしても間違っており、機能しないと言っておきます。

Maven3.1ではバージョンレスparentが許可されます。

も参照してください

于 2010-09-10T14:10:53.420 に答える