Maven 项目聚合和变量

Posted

技术标签:

【中文标题】Maven 项目聚合和变量【英文标题】:Maven Project Aggregation and Variables 【发布时间】:2014-04-16 06:26:04 【问题描述】:

聚合项目 1:

    <groupId>com.mycompany</groupId>
    <artifactId>builder</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    <modules>
        <module>../module-1</module>
        <module>../module-2</module>
    </modules>
    <properties>
        <project.parent.pom>../builder-v1/pom.xml</project.parent.pom>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <lib.version>2.5.1</lib.version>
    </properties>

聚合项目 2:

    <groupId>com.mycompany</groupId>
    <artifactId>builder</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    <modules>
        <module>../module-1</module>
        <module>../module-4</module>
        <module>../module-6</module>
    </modules>
    <properties>
        <project.parent.pom>../builder-v2/pom.xml</project.parent.pom>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <lib.version>2.6.0</lib.version>
    </properties>

模块 1:

    <parent>
        <groupId>com.mycompany</groupId>
        <artifactId>builder</artifactId>
        <version>1.0.0</version>
        <relativePath>../builder-v1/pom.xml</relativePath>
        <!--<relativePath>$project.parent.pom</relativePath> not work-->
    </parent>

    <groupId>com.mycompany</groupId>
    <artifactId>module-1</artifactId>

带有来自聚合 pom 的变量的部分 relativePath 不起作用

<relativePath>../builder-v1/pom.xml</relativePath>
<!--<relativePath>$project.parent.pom</relativePath> not work-->

但我在聚合项目中需要不同的 $lib.version。如果我从中删除继承部分 模块 1:

    <!--<parent>
        <groupId>com.mycompany</groupId>
        <artifactId>builder</artifactId>
        <version>1.0.0</version>
        <relativePath>../builder-v1/pom.xml</relativePath>
    </parent>-->

    <groupId>com.mycompany</groupId>
    <artifactId>module-1</artifactId>

变量没有传递给子模块,我得到了错误:

'dependencies.dependency.version' for com.somelib:some-lib:jar must be a valid version but is '$lib.version'.

如何配置聚合项目并将变量传输到模块中?

使用@Gab cmets 更新

父 pom:

    <groupId>com.mycompany</groupId>
    <artifactId>parent</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <profiles>
        <profile>
      <id>v1</id>
            <activation>
                <property>
                    <name>project.type</name>
                    <value>v1</value>
                </property>
            </activation>
        <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>             
          <lib.version>2.5.1</lib.version>
        </properties>
        </profile>
        ...
    </profiles>

模块 1:

    <parent>
        <groupId>com.mycompany</groupId>
        <artifactId>parent</artifactId>
        <version>1.0.0</version>
    </parent>

    <groupId>com.mycompany</groupId>
    <artifactId>module-1</artifactId>

聚合项目 1:

    <groupId>com.mycompany</groupId>
    <artifactId>builder-v1</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    <modules>
        <module>../module-1</module>
        <module>../module-2</module>
    </modules>

执行builder-v1目标时激活配置文件project.type=v1

mvn clean package --file=pom_v1.xml -Dproject.type=v1 -Dproject.main.module=module-1

【问题讨论】:

【参考方案1】:

也许定义一个共同的父级,其中 2 个配置文件为 $lib.version 定义不同的值,并在您的“聚合”pom 中自动激活一个配置文件。您的所有模块都将从父模块继承

parent-pom (defining 2 different profiles)
|
+ aggregate 1 (inherit from parent-pom - activate profile 1)
| |
| + module 1 (inherit from parent-pom)
  |
| + module 2 (inherit from parent-pom)
+ aggregate 2 (inherit from parent-pom - activate profile 2)
  |
  + module 1 (inherit from parent-pom)
  |
  + module 3 (inherit from parent-pom)

[编辑] 似乎在“聚合” poms 中自动激活一个配置文件以避免在 maven 命令中指定属性的唯一技巧是

<activation>
  <file>
    <exists>relative_path_of_file_specific_to_project</exists>
  </file>
</activation>

因为基于属性的激活仅适用于系统属性(不是 pom 中定义的属性),并且您不能覆盖继承的配置文件配置(默认情况下处于活动状态)。

【讨论】:

这很有帮助,谢谢我找到了一个可行的配置:在共同的父 pom 中创建 2 个配置文件并设置属性。按属性激活配置文件。执行 mvn 时设置属性: mvn clean package -DsomeProperty=v1 > 不需要在maven命令中指定属性我们不能在项目pom中使用设置:无法识别的标签:'settings',我们只能在maven设置中激活配置文件。这不是我试图做的。我尝试配置两个自动构建聚合项目,这与通过 maven 命令激活 错过了设置 ;) activeByDefault 如何帮助我选择配置文件?在关闭文档中没有关于这些技巧的内容...... 你说得对,我认为可以覆盖继承配置文件的激活,但事实并非如此。【参考方案2】:

如果我正确理解您的问题,您希望您的模块有多个父级。这不可能。请参阅此discussion。

你可以试试@Gab 的建议。基本上定义了两个profiles - 一个用于builder-v1,另一个用于builder-v2。您几乎可以在配置文件中执行任何操作,包括指定不同的模块集和不同的属性/版本。

【讨论】:

您是否建议为所有模块创建具有共同父级的层次结构,但 2 个聚合项目?

以上是关于Maven 项目聚合和变量的主要内容,如果未能解决你的问题,请参考以下文章

taotao--maven框架搭建思路(用时1下午+1晚上)

Maven环境变量配置

maven安装与环境变量配置

Maven最全面的安装和配置环境变量

Maven最全面的安装和配置环境变量

使用IntelliJ IDEA 14和Maven创建java web项目