Index: src/main/java/org/apache/maven/plugin/invoker/AbstractInvokerMojo.java =================================================================== --- src/main/java/org/apache/maven/plugin/invoker/AbstractInvokerMojo.java (revision 1326561) +++ src/main/java/org/apache/maven/plugin/invoker/AbstractInvokerMojo.java (working copy) @@ -27,8 +27,12 @@ import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugin.invoker.model.BuildJob; import org.apache.maven.plugin.invoker.model.io.xpp3.BuildJobXpp3Writer; +import org.apache.maven.plugin.registry.TrackableBase; import org.apache.maven.project.MavenProject; import org.apache.maven.settings.Settings; +import org.apache.maven.settings.SettingsUtils; +import org.apache.maven.settings.io.xpp3.SettingsXpp3Reader; +import org.apache.maven.settings.io.xpp3.SettingsXpp3Writer; import org.apache.maven.shared.invoker.CommandLineConfigurationException; import org.apache.maven.shared.invoker.DefaultInvocationRequest; import org.apache.maven.shared.invoker.InvocationRequest; @@ -50,11 +54,14 @@ import org.codehaus.plexus.util.ReaderFactory; import org.codehaus.plexus.util.StringUtils; import org.codehaus.plexus.util.WriterFactory; +import org.codehaus.plexus.util.xml.XmlStreamReader; +import org.codehaus.plexus.util.xml.pull.XmlPullParserException; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; @@ -1283,8 +1290,8 @@ * * @param basedir The base directory of the project, must not be null. * @param pomFile The (already interpolated) POM file, may be null for a POM-less Maven invocation. - * @param settingsFile The (already interpolated) user settings file for the build, may be null to use - * the current user settings. + * @param settingsFile The (already interpolated) user settings file for the build, may be null. Will be + * merged with the settings file of the invoking Maven process. * @param invokerProperties The properties to use. * @return true if the project was launched or false if the selector script indicated that * the project should be skipped. @@ -1337,7 +1344,66 @@ request.setLocalRepositoryDirectory( localRepositoryPath ); - request.setUserSettingsFile( settingsFile ); + Settings mergedSettings = null; + if ( settingsFile != null ) + { + // Have to merge the specified settings file (dominant) and the one of the invoking Maven process + Reader reader = null; + try + { + reader = new XmlStreamReader(settingsFile); + SettingsXpp3Reader settingsReader = new SettingsXpp3Reader(); + Settings dominantSettings = settingsReader.read(reader); + Settings recessiveSettings = this.settings; + + SettingsUtils.merge( dominantSettings, recessiveSettings, TrackableBase.USER_LEVEL ); + + mergedSettings = dominantSettings; + getLog().debug( "Merged specified settings file with settings of invoking process" ); + } + catch ( XmlPullParserException e ) + { + throw new MojoExecutionException( "Could not read specified settings file", e ); + } + catch ( IOException e ) + { + throw new MojoExecutionException( "Could not read specified settings file", e ); + } + finally + { + IOUtil.close( reader ); + } + } + else + { + mergedSettings = this.settings; + } + + try { + File mergedSettingsFile = File.createTempFile( "invoker-settings", ".xml" ); + SettingsXpp3Writer settingsWriter = new SettingsXpp3Writer(); + FileWriter fileWriter = null; + try + { + fileWriter = new FileWriter( mergedSettingsFile ); + settingsWriter.write( fileWriter, mergedSettings ); + } + finally + { + IOUtil.close( fileWriter ); + } + + if ( getLog().isDebugEnabled() ) + { + getLog().debug( "Created temporary file for invoker settings.xml: " + + mergedSettingsFile.getAbsolutePath() ); + } + request.setUserSettingsFile( mergedSettingsFile ); + } + catch ( IOException e ) + { + throw new MojoExecutionException( "Could not create temporary file for invoker settings.xml", e ); + } request.setInteractive( false ); Index: src/it/settings-inherit/pom.xml =================================================================== --- src/it/settings-inherit/pom.xml (revision 0) +++ src/it/settings-inherit/pom.xml (revision 0) @@ -0,0 +1,58 @@ + + + + + + 4.0.0 + + org.apache.maven.plugins.invoker + settings-inherit + 1.0-SNAPSHOT + pom + + Test to check that the settings.xml from the calling process is inherited. + + + UTF-8 + + + + + + org.apache.maven.plugins + maven-invoker-plugin + @project.version@ + + ${project.build.directory}/it + true + + + + integration-test + initialize + + run + + + + + + + Index: src/it/settings-inherit/src/it/project/pom.xml =================================================================== --- src/it/settings-inherit/src/it/project/pom.xml (revision 0) +++ src/it/settings-inherit/src/it/project/pom.xml (revision 0) @@ -0,0 +1,60 @@ + + + + + + 4.0.0 + test + project + 0.1-SNAPSHOT + pom + + + UTF-8 + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 1.0.1 + + + enforce-property + + enforce + + + + + it.settings-inherit + Property not present - settings.xml from calling process not inherited! + (exists)$ + + + true + + + + + + + Index: src/it/settings.xml =================================================================== --- src/it/settings.xml (revision 1326561) +++ src/it/settings.xml (working copy) @@ -20,6 +20,15 @@ --> + + + + dummy-it-settings-merge + user + password + + + it-repo @@ -29,6 +38,10 @@ @localRepository@ + + exists + + exists Index: src/it/settings-merge/pom.xml =================================================================== --- src/it/settings-merge/pom.xml (revision 0) +++ src/it/settings-merge/pom.xml (revision 0) @@ -0,0 +1,60 @@ + + + + + + 4.0.0 + + org.apache.maven.plugins.invoker + settings-merge + 1.0-SNAPSHOT + pom + + Test to check that the settings.xml from the calling process is merged with the + one specified for m-invoker-p. + + + UTF-8 + + + + + + org.apache.maven.plugins + maven-invoker-plugin + @project.version@ + + ${project.build.directory}/it + true + src/it/settings.xml + + + + integration-test + initialize + + run + + + + + + + Index: src/it/settings-merge/src/it/settings.xml =================================================================== --- src/it/settings-merge/src/it/settings.xml (revision 0) +++ src/it/settings-merge/src/it/settings.xml (revision 0) @@ -0,0 +1,42 @@ + + + + + + + + dummy-it-settings-merge + user + overridden + + + + + + it-properties + + true + + + exists + + + + Index: src/it/settings-merge/src/it/project/pom.xml =================================================================== --- src/it/settings-merge/src/it/project/pom.xml (revision 0) +++ src/it/settings-merge/src/it/project/pom.xml (revision 0) @@ -0,0 +1,87 @@ + + + + + + 4.0.0 + test + project + 0.1-SNAPSHOT + pom + + + UTF-8 + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 1.0.1 + + + verify-properties + + enforce + + + + + it.settings-merge.1 + Property not present - settings.xml from calling process not merged! + (exists)$ + + + it.settings-merge.2 + Property not present - specified settings.xml not merged! + (exists)$ + + + true + + + + + + org.codehaus.gmaven + gmaven-plugin + 1.4 + + + verify-server + validate + + execute + + + + def server = settings.servers.find{ it.id.equals('dummy-it-settings-merge') } + if( !server.password.equals('overridden') ) + throw new org.apache.maven.plugin.MojoExecutionException("Incorrect server password - specified settings.xml not merged/dominant") + + + + + + + +