如何在Maven中定义条件属性?

18
例如,如果存在环境变量AAA,则我希望将属性Configuration设置为${env:AAA},否则设置为其他常量值。在maven 2中如何实现?

你想有条件地设置一个属性吗? - AlikElzin-kilaka
3个回答

12

看起来你需要有条件地激活一个配置文件...

<profiles>
  <profile>
    <activation>
      <property>
        <name>environment</name>
        <value>test</value>
      </property>
    </activation>
    ...
  </profile>
</profiles>

当环境变量被定义为值test时,配置文件将被激活,如以下命令所示:

mvn ... -Denvironment=test


我不太明白。你是说maven没有属性条件吗?如果我有10个属性,并且我想通过环境允许覆盖每一个属性,那么我需要定义多少个配置文件呢? - mark
取决于您的构建系统。如果这10个属性是互斥的,那么似乎您需要定义10个配置文件。但是,如果是这种情况,我建议您重新审查您的逻辑。 - hd1
1
而要测试其不存在:<name>!my.variable.which.could.be.missing</name> https://earlyandoften.wordpress.com/2011/02/09/disable-maven-profile/ - Adam
一个有用的替代方法是在调用mvn的任何地方执行它。例如,您可能在shell脚本中具有更多的能力来有条件地设置环境变量。这是我在阅读了这个答案后最终采取的措施。具体而言,我在我的gitlab .yml文件中添加了几行代码来导出一个环境变量,然后通过-D标志将它们传递给mvn。 - Adam Wise

11

如果系统属性可接受,您可以在POM文件中定义该属性并在需要时进行覆盖:

<project>
...
  <properties>
     <foo.bar>hello</foo.bar>
  </properties>
...
</project>

您可以通过引用${foo.bar}在POM中的其他地方引用此属性。要在命令行上覆盖它,只需传递一个新值:

您可以通过在POM的其他位置引用${foo.bar}来参考此属性。要在命令行上进行覆盖,只需传递一个新值即可:

mvn -Dfoo.bar=goodbye ...

10
您可以使用maven-antrun-plugin有条件地设置属性。例如,设置install.path并回显其值:
<plugin>
    <!-- Workaround maven not being able to set a property conditionally based on environment variable -->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.8</version>
    <executions>
        <execution>
            <phase>validate</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <exportAntProperties>true</exportAntProperties>
                <target>
                    <property environment="env"/>
                    <condition property="install.path" value="${env.INSTALL_HOME}" else="C:\default-install-home">
                        <isset property="env.INSTALL_HOME" />
                    </condition>
                    <echo message="${install.path}"/>
                </target>
            </configuration>
        </execution>
    </executions>
</plugin>

注意,如果您尝试在另一个maven-antrun-plugin中使用${install.path},它们必须具有相同的版本。 - AlikElzin-kilaka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接