I have 2 profiles that may or may not be used together to run a group of tests. They each require different vmargs to run, but if they are used together it's ok to have them appended to each other.
What I'm looking for is a way to set argLine to be the concatenation of its current value plus what I set.
I was hoping it would as simple as
<argLine>${argLine} -DnewVMArg</argLine>
Is there something similar I can do to make this happen?
I made an attempt at fixing it which results in maven getting stuck in a recursive cycle. It's documented below.
My Most recent attempt was to define a property <my.argLines></my.argLines>
globally, and then to modify this within the profiles.
In each profile, in a properties block, I set overrode the property to:
<my.argLines>${my.argLines} -myUniqueToProfileArgs</my.argLines>
In each surefire configuration for the profiles, I set <argLines>
to be:
<argLines>${my.argLines}</argLines>
This logically fits for me, but the way it evalutes is apparently not going to mesh.
Define your default arguments -DnewVMArg
inside argLine
like below:
<properties>
<customArg/>
<argLine>${customArg} -DnewVMArg</argLine>
</properties>
Define profiles arguments
<profiles>
<profile>
<id>profile1</id>
<properties>
<customArg>-DmyUniqueToProfile1Args</customArg>
</properties>
</profile>
<profile>
<id>profile2</id>
<properties>
<customArg>-DmyUniqueToProfile2Args</customArg>
</properties>
</profile>
</profiles>
Additional plugin configuration is not required
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.16</version>
<configuration/>
</plugin>
....
I have tested this configuration, my results below.
Default
mvn surefire:test -X
Result
(...)java -jar -DnewVMArg (...)
Goal with profile
mvn surefire:test -X -Pprofile1
Result
(...)java -DmyUniqueToProfile1Args -DnewVMArg -jar (...)
If you are dealing only with -D system properties, you could use <systemPropertyVariables> instead of <argLine> and then they will be combined naturally. One of the profiles could have:
<systemPropertyVariables>
<propertyFromProfile1>value1</propertyFromProfile1>
</systemPropertyVariables>
and the second profile:
<systemPropertyVariables>
<propertyFromProfile2>value2</propertyFromProfile2>
</systemPropertyVariables>
Also, it's worth mentioning that this approach allows you to override in child poms individual properties from parent poms.
As you found out, a property cannot reference itself.
You need to define different properties for each profile and finally concatenate them in your surefire call:
<properties>
<!-- it is a good idea not to use empty or blank properties -->
<first.props>-Dprofile1Active=false</first.props>
<second.props>-Dprofile2Active=false</second.props>
</properties>
...
<!-- surefire configuration -->
<argLine>${first.props} ${second.props}</argLine>
...
<profile>
<id>first</id>
<properties>
<first.props>-myUniqueToProfile1Args</first.props>
</properties>
</profile>
<profile>
<id>second</id>
<properties>
<second.props>-myUniqueToProfile2Args</second.props>
</properties>
</profile>
Also note the not-empty default value. Maven has some surprising way of handling those. In order to be on the safe side, use harmless non-blank default values (see “Null” versus “empty” arguments in Maven)
Eclipse: Window -> Preferences -> TestNG -> Maven Uncheck the 'argLine'.
来源:https://stackoverflow.com/questions/13829538/maven-surefire-append-to-argline