目前遇到一个奇怪的问题,一个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脚本中使用重写值的内容?
答案 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