【问题标题】:Activating a Child Profile from a Parent Profile从父配置文件激活子配置文件
【发布时间】:2016-05-20 04:32:15
【问题描述】:

我有以下父 pom.xml 文件:

<profile>
    <id>build_full</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <modules>
        <module>mymodule_interface</module>
        <module>mymodule_switch</module>
        <module>mymodule_switch_simulator</module>
        <module>mymodule_switch_controller</module>
        <module>mymodule_server</module>
    </modules>
</profile>

在我的 mymodule_server 的孩子 pom 中,我有以下内容:

<profile>
    <id>subprofile</id>
    <modules>
        <module>...various modules...</module>
    </modules>
</profile>  
<profile>
    <id>default</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <modules>
        <module>...various modules...</module>
    </modules>
</profile>  

当我调用 maven:mvn -P build_full 时,如何强制子模块 (mymodule_server) 使用配置文件 subprofile 而不是 default

【问题讨论】:

    标签: maven maven-3 maven-profiles


    【解决方案1】:

    不,您不能从父配置文件激活子配置文件。更一般地说,you can't activate or deactivate any profile from any other profile(有一个 JIRA 功能请求MNG-3309)。你可以做的是activate two profiles based on the same property

    首先,使用默认激活的配置文件通常不是一个好主意。您想要的是根据某些条件(操作系统版本、系统属性...)激活配置文件。为了解决您的问题,您可以在存在某个系统属性时激活build_full 配置文件,并确保在存在该相同属性时也激活subprofile

    示例配置如下,当fullBuild 系统属性设置为true 时,两个配置文件都被激活。因此,使用mvn -DfullBuild=true ... 调用 Maven 将激活两个配置文件。

    <profile>
        <id>build_full</id>
        <activation>
            <property>
                <name>fullBuild</name>
                <value>true</value>
            </property>
        </activation>
        <modules>
            <module>mymodule_interface</module>
            <module>mymodule_switch</module>
            <module>mymodule_switch_simulator</module>
            <module>mymodule_switch_controller</module>
            <module>mymodule_server</module>
        </modules>
    </profile>
    
    <profile>
        <id>subprofile</id>
        <activation>
            <property>
                <name>fullBuild</name>
                <value>true</value>
            </property>
        </activation>
        <modules>
            <module>...various modules...</module>
        </modules>
    </profile>
    

    【讨论】:

    • 我刚刚在本地测试过,然后才发布我的答案,我可能犯了一个错误,然后重新测试一下
    • @A.DiMatteo 这在从父 POM 运行时应该可以工作。您的解决方案也应该有效,但我找不到所有 -P 参数(我认为这太脆弱了)
    • 我确认这两种解决方案都运行良好。实际上,您的建议在命令行中不那么冗长,并将激活集中在一个共同的地方,更好。
    【解决方案2】:

    在您的情况下,您可以从顶部的父/聚合器文件夹中运行:

    mvn clean install -Pbuild_full,!default,subprofile
    

    它将禁用任何名称为 default 的配置文件(并因此禁用相关子模块中的配置文件)并启用任何名称为 subprofile 的配置文件(从而启用您想要的配置文件)。

    或者,您可以像这样配置subprofile

    <profiles>
        <profile>
            <id>subprofile</id>
            <activation>
                <property>
                    <name>subprofile</name>
                    <value>true</value>
                </property>
            </activation>
            ....
    

    然后运行如下:

    mvn clean install -Dsubprofile=true -Pbuild_full
    

    会有同样的效果。您甚至可以避免使用value 元素并简单地指定-Dsubprofile,它的存在就足以激活配置文件(在这种情况下,建议使用更有意义的名称,例如-DactivateSubprofile)。由于您激活了不同的配置文件,Maven 将自动停用默认配置文件。

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 1970-01-01
      • 2011-11-12
      • 2014-10-29
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      相关资源
      最近更新 更多