diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java index 633d53310f..a27517b8e8 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java @@ -27,6 +27,7 @@ import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.UnrecognizedOptionException; +import org.apache.commons.lang3.ArrayUtils; import org.apache.maven.BuildAbort; import org.apache.maven.InternalErrorException; import org.apache.maven.Maven; @@ -542,7 +543,9 @@ else if ( MavenExecutionRequest.CHECKSUM_POLICY_FAIL.equals( cliRequest.request. } } - private void properties( CliRequest cliRequest ) + //Needed to make this method package visible to make writing a unit test possible + //Maybe it's better to move some of those methods to separate class (SoC). + void properties( CliRequest cliRequest ) { populateProperties( cliRequest.commandLine, cliRequest.systemProperties, cliRequest.userProperties ); } @@ -1581,9 +1584,14 @@ static void populateProperties( CommandLine commandLine, Properties systemProper if ( commandLine.hasOption( CLIManager.SET_SYSTEM_PROPERTY ) ) { String[] defStrs = commandLine.getOptionValues( CLIManager.SET_SYSTEM_PROPERTY ); - + if ( defStrs != null ) { + //The following is needed to get precedence + //of properties which are defined on command line + //over properties defined in the .mvn/maven.config. + ArrayUtils.reverse( defStrs ); + for ( String defStr : defStrs ) { setCliProperty( defStr, userProperties ); diff --git a/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java b/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java index c8d75b1040..d92662494d 100644 --- a/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java +++ b/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java @@ -21,10 +21,10 @@ import java.io.File; -import junit.framework.TestCase; - import org.apache.commons.cli.ParseException; +import junit.framework.TestCase; + public class MavenCliTest extends TestCase { @@ -81,8 +81,8 @@ public void testMavenConfig() // read .mvn/maven.config cli.initialize( request ); cli.cli( request ); - assertEquals( "multithreaded", request.commandLine.getOptionValue( "builder" ) ); - assertEquals( "8", request.commandLine.getOptionValue( "threads" ) ); + assertEquals( "multithreaded", request.commandLine.getOptionValue( CLIManager.BUILDER ) ); + assertEquals( "8", request.commandLine.getOptionValue( CLIManager.THREADS ) ); // override from command line request = new CliRequest( new String[] { "--builder", "foobar" }, null ); @@ -107,4 +107,49 @@ public void testMavenConfigInvalid() } } + + /** + * Read .mvn/maven.config with the following definitions: + *
+     *   -T 3
+     *   -Drevision=1.3.0
+     * 
+ * and check if the {@code -T 3} option can be overwritten via command line + * argument. + * @throws Exception in case of failure. + */ + public void testMVNConfigurationThreadCanBeOverwrittenViaCommandLine() throws Exception { + System.setProperty( MavenCli.MULTIMODULE_PROJECT_DIRECTORY, new File( "src/test/projects/mavenConfigProperties" ).getCanonicalPath() ); + CliRequest request = new CliRequest( new String[]{ "-T", "5" }, null ); + + cli.initialize( request ); + // read .mvn/maven.config + cli.cli( request ); + + assertEquals( "5", request.commandLine.getOptionValue( CLIManager.THREADS ) ); + } + + /** + * Read .mvn/maven.config with the following definitions: + *
+     *   -T 3
+     *   -Drevision=1.3.0
+     * 
+ * and check if the {@code -Drevision-1.3.0} option can be overwritten via command line + * argument. + * @throws Exception + */ + public void testMVNConfigurationDefinedPropertiesCanBeOverwrittenViaCommandLine() throws Exception { + System.setProperty( MavenCli.MULTIMODULE_PROJECT_DIRECTORY, new File( "src/test/projects/mavenConfigProperties" ).getCanonicalPath() ); + CliRequest request = new CliRequest( new String[]{ "-Drevision=8.1.0"}, null ); + + cli.initialize( request ); + // read .mvn/maven.config + cli.cli( request ); + cli.properties( request ); + + String revision = System.getProperty( "revision" ); + assertEquals( "8.1.0", revision ); + + } } diff --git a/maven-embedder/src/test/projects/mavenConfigProperties/.mvn/maven.config b/maven-embedder/src/test/projects/mavenConfigProperties/.mvn/maven.config new file mode 100644 index 0000000000..c73de53aeb --- /dev/null +++ b/maven-embedder/src/test/projects/mavenConfigProperties/.mvn/maven.config @@ -0,0 +1,3 @@ +-T 3 +-Drevision=1.3.0 +