Maven没有将重写属性传递给ant

时间:2013-02-22 12:57:37

标签: maven ant build system-properties

目前遇到一个奇怪的问题,一个Maven构建正在调用ant,在父pom中定义了以下属性: -

<jboss.home>${env.JBOSS_HOME}</jboss.home>

我试图通过在运行Maven时传入-Djboss.home来覆盖它。

此版本包含一个配置文件,在激活时调用Ant构建: -

<ant antfile="build.xml" inheritRefs="true">
    <target name="all"/>
</ant>

Ant脚本使用以下属性: -

<property name="jboss.dir" value="${jboss.home}"/>

随后输出: -

<echo message="jboss dir is: ${jboss.dir}"/>

问题是它输出的值是$ {env.JBOSS_HOME}

父pom中的其他属性我可以从命令行覆盖。

如果在Maven构建中的其他位置使用,即使是jboss.home属性也会被覆盖。

在尝试各种命令组合之后,几乎看起来传递给Ant的属性集是从命令行中的任何覆盖之前的poms中解析的。如果我设置JBOSS_HOME环境变量,则使用此变量的所有位置都具有正确的值。

我是否缺少能够在命令行上覆盖此变量并在Ant脚本中使用重写值的内容?

3 个答案:

答案 0 :(得分:1)

问题是${env.JBOSS_HOME}是系统环境变量,而是将系统属性-Djboss.home=...传递给JVM。这是两件不同的事情。除此之外,Java世界中的任何变量,参数等都区分大小写。

答案 1 :(得分:1)

今天偶然发现了这个问题,并找到了答案。该链接提供了一些背景信息:http://technotes.khitrenovich.com/properties-resolution-maven-implications-antrun-plugin/

如果在中内联引用该属性,则

Maven属性将正常工作。例如:

    <execution>
      ..
      <configuration>
        <target>
          <echo message="Command-line override of external.property will work OK like this: ${external.property}"/>
        </target>
      </configuration>
    </execution>

但是,如果您使用这样编写的外部ant文件,则许多属性将起作用,而 BUT 命令行替代将不会传递到ant文件中。您将获得非覆盖值。

    <execution>
      ..
      <configuration>
        <target>
          <property name="external.property" value="${external.property}" />
          <ant antfile="build.xml" target="all" />
        </target>
      </configuration>
    </execution>

相反,对于外部ant文件,请使用此语法。命令行值将正确地传递到外部antfile:

    <execution>
      ..
      <configuration>
        <target>
          <ant antfile="build.xml" target="all" >
            <property name="external.property" value="${external.property}" />
          <ant/>
        </target>
      </configuration>
    </execution>

答案 2 :(得分:0)

你似乎做了所有正确的事情,它对我有用,我用2个pom.xml文件制作了一个工作示例。父pom看起来像这样:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.stackoverflow.test</groupId>
        <artifactId>test</artifactId>
        <version>1.0</version>
    <name>Test</name>
    <packaging>pom</packaging>
    <modules>
        <module>test-ant-properties</module>
    </modules>
    <properties>
        <jboss.home>${env.JBOSS_HOME}</jboss.home>
    </properties>
</project>

然后我在子文件夹 test-ant-properties 中创建了一个模块pom.xml,如下所示:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.stackoverflow.test</groupId>
        <artifactId>test</artifactId>
        <version>1.0</version>
    </parent>
    <artifactId>test-ant-properties</artifactId>
    <name>Test maven ant properties</name>
    <profiles>
        <profile>
            <id>jboss</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-antrun-plugin</artifactId>
                        <version>1.6</version>
                        <executions>
                            <execution>
                                <id>jboss-ant</id>
                                <phase>install</phase>
                                <configuration>
                                    <target>
                                        <property name="jboss.dir" value="${jboss.home}"/>
                                        <echo message="jboss dir is: ${jboss.dir}"/>                                
                                    </target>
                                </configuration>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

我没有安装JBOSS,所以出于测试目的我将environement变量设置为test1234,如下所示: set JBOSS_HOME=test1234

当我使用jboss配置文件执行父pom时

mvn install -Pjboss

我得到以下结果: [echo] jboss dir是:test1234

当我使用 jboss.home 设置

执行相同的命令时
mvn install -Pjboss -Djboss.home=my_custom_variable

我得到以下结果: [echo] jboss目录是:my_custom_variable