diff --git a/maven-plugin/src/main/java/hudson/maven/MavenEmbedderRequest.java b/maven-plugin/src/main/java/hudson/maven/MavenEmbedderRequest.java index 955f27e82d211e349d22c55a18ae696f6d2c433a..1ae8115407617790c5566c1b379c55de6ef23fe7 100755 --- a/maven-plugin/src/main/java/hudson/maven/MavenEmbedderRequest.java +++ b/maven-plugin/src/main/java/hudson/maven/MavenEmbedderRequest.java @@ -28,6 +28,7 @@ import java.io.File; import java.util.Properties; import org.apache.maven.model.building.ModelBuildingRequest; +import org.sonatype.aether.repository.WorkspaceReader; import org.sonatype.aether.transfer.TransferListener; /** @@ -73,6 +74,11 @@ public class MavenEmbedderRequest */ private int validationLevel = ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0; + /** + * @since 1.393 + */ + private WorkspaceReader workspaceReader; + /** * @param listener * This is where the log messages from Maven will be recorded. @@ -188,14 +194,20 @@ public class MavenEmbedderRequest return this; } - public int getValidationLevel() - { + public int getValidationLevel() { return validationLevel; } - public MavenEmbedderRequest setValidationLevel( int validationLevel ) - { + public MavenEmbedderRequest setValidationLevel( int validationLevel ) { this.validationLevel = validationLevel; return this; } + + public WorkspaceReader getWorkspaceReader() { + return workspaceReader; + } + + public void setWorkspaceReader( WorkspaceReader workspaceReader ) { + this.workspaceReader = workspaceReader; + } } diff --git a/maven-plugin/src/main/java/hudson/maven/MavenModuleSetBuild.java b/maven-plugin/src/main/java/hudson/maven/MavenModuleSetBuild.java old mode 100644 new mode 100755 index ab52b711e1c314fe13e38284a7ad3935b4e32b92..10e78f076f6e05089b89160a677c66bd26a76898 --- a/maven-plugin/src/main/java/hudson/maven/MavenModuleSetBuild.java +++ b/maven-plugin/src/main/java/hudson/maven/MavenModuleSetBuild.java @@ -1078,21 +1078,40 @@ public class MavenModuleSetBuild extends AbstractMavenBuild= 0; - if (maven3OrLater) + if (maven3OrLater) { mavenEmbedderRequest.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_0 ); - + } else { + reactorReader = new ReactorReader( new HashMap(), new File(workspaceProper) ); + mavenEmbedderRequest.setWorkspaceReader( reactorReader ); + } //mavenEmbedderRequest.setClassLoader( MavenEmbedderUtils.buildClassRealm( mavenHome.getHomeDir(), null, null ) ); MavenEmbedder embedder = MavenUtil.createEmbedder( mavenEmbedderRequest ); - List mps = embedder.readProjects( pom,true); + MavenProject rootProject = null; + + List mps = new ArrayList(0); + if (maven3OrLater) { + mps = embedder.readProjects( pom,true ); + + } else { + // http://issues.hudson-ci.org/browse/HUDSON-8390 + // we cannot read maven projects in one time for backward compatibility + // but we have to use a ReactorReader to get some pom with bad inheritence configured + MavenProject mavenProject = embedder.readProject( pom ); + rootProject = mavenProject; + mps.add( mavenProject ); + reactorReader.addProject( mavenProject ); + readChilds( mavenProject, embedder, mps, reactorReader ); + } Map canonicalPaths = new HashMap( mps.size() ); for(MavenProject mp : mps) { // Projects are indexed by POM path and not module path because // Maven allows to have several POMs with different names in the same directory canonicalPaths.put( mp.getFile().getCanonicalPath(), mp ); - } + } //MavenUtil.resolveModules(embedder,mp,getRootPath(rootPOMRelPrefix),relPath,listener,nonRecursive); if(verbose) { @@ -1101,11 +1120,13 @@ public class MavenModuleSetBuild extends AbstractMavenBuild infos = new LinkedHashSet(); - MavenProject rootProject = null; - for (MavenProject mp : mps) { - if (mp.isExecutionRoot()) { - rootProject = mp; - continue; + + if (maven3OrLater) { + for (MavenProject mp : mps) { + if (mp.isExecutionRoot()) { + rootProject = mp; + continue; + } } } // if rootProject is null but no reason :-) use the first one @@ -1152,6 +1173,22 @@ public class MavenModuleSetBuild extends AbstractMavenBuild mavenProjects, ReactorReader reactorReader) + throws ProjectBuildingException, MavenEmbedderException { + if (mp.getModules() == null || mp.getModules().isEmpty()) { + return; + } + for (String module : mp.getModules()) { + if ( Util.fixEmptyAndTrim( module ) != null ) { + MavenProject mavenProject2 = + mavenEmbedder.readProject( new File(mp.getFile().getParent(), module + "/pom.xml") ); + mavenProjects.add( mavenProject2 ); + reactorReader.addProject( mavenProject2 ); + readChilds( mavenProject2, mavenEmbedder, mavenProjects, reactorReader ); + } + } + } private static final long serialVersionUID = 1L; } diff --git a/maven-plugin/src/main/java/hudson/maven/MavenUtil.java b/maven-plugin/src/main/java/hudson/maven/MavenUtil.java old mode 100644 new mode 100755 index 025b52c81bee69373c681ee7bbf8dfd6fd2390ee..ace90a26d98e13b5c5402f760879c17d847dfb3a --- a/maven-plugin/src/main/java/hudson/maven/MavenUtil.java +++ b/maven-plugin/src/main/java/hudson/maven/MavenUtil.java @@ -166,6 +166,9 @@ public class MavenUtil { // FIXME configure those !! mavenRequest.setGlobalSettingsFile( new File( mavenEmbedderRequest.getMavenHome(), "conf/settings.xml" ).getAbsolutePath() ); + if (mavenEmbedderRequest.getWorkspaceReader() != null ) { + mavenRequest.setWorkspaceReader( mavenEmbedderRequest.getWorkspaceReader() ); + } // TODO olamy check this sould be userProperties mavenRequest.setSystemProperties(mavenEmbedderRequest.getSystemProperties()); diff --git a/test/src/test/java/hudson/maven/Maven3BuildTest.java b/test/src/test/java/hudson/maven/Maven3BuildTest.java old mode 100644 new mode 100755 index 59dd3ddab28c0841d87e6acf57cee222b40bd8b3..cd7e2de4ab4e21eb54818ca4a75d41fbe1b7b292 --- a/test/src/test/java/hudson/maven/Maven3BuildTest.java +++ b/test/src/test/java/hudson/maven/Maven3BuildTest.java @@ -84,6 +84,21 @@ public class Maven3BuildTest extends HudsonTestCase { System.out.println("mmsb.getProject().getModules " + mmsb.getProject().getModules() ); assertTrue( mmsb.getProject().getModules().isEmpty()); } + + @Bug(value=8390) + public void testMaven3BuildWrongInheritence() throws Exception { + + MavenModuleSet m = createMavenProject(); + MavenInstallation mavenInstallation = configureMaven3(); + m.setMaven( mavenInstallation.getName() ); + m.getReporters().add(new TestReporter()); + m.setScm(new ExtractResourceSCM(getClass().getResource("incorrect-inheritence-testcase.zip"))); + m.setGoals( "clean validate" ); + MavenModuleSetBuild mmsb = m.scheduleBuild2( 0 ).get(); + assertBuildStatus( Result.FAILURE, mmsb ); + System.out.println("mmsb.getProject().getModules " + mmsb.getProject().getModules() ); + assertTrue( mmsb.getProject().getModules().isEmpty()); + } diff --git a/test/src/test/java/hudson/maven/MavenBuildTest.java b/test/src/test/java/hudson/maven/MavenBuildTest.java old mode 100644 new mode 100755 index 427b83e80523a96f4d698a50ca62add23b9c3b46..cc38f41d99f64c890acf553bfb64b89e292f1c51 --- a/test/src/test/java/hudson/maven/MavenBuildTest.java +++ b/test/src/test/java/hudson/maven/MavenBuildTest.java @@ -64,15 +64,6 @@ public class MavenBuildTest extends HudsonTestCase { assertBuildStatus(Result.FAILURE, m.scheduleBuild2(0).get()); } - private static class TestReporter extends MavenReporter { - @Override - public boolean end(MavenBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { - assertNotNull(build.getProject().getWorkspace()); - assertNotNull(build.getWorkspace()); - return true; - } - } - /** * Workspace determination problem on non-aggregator style build. */ @@ -107,4 +98,26 @@ public class MavenBuildTest extends HudsonTestCase { assertFalse( mmsb.getProject().getModules().isEmpty()); } + @Bug(value=8390) + public void testMaven2BuildWrongInheritence() throws Exception { + + MavenModuleSet m = createMavenProject(); + MavenInstallation mavenInstallation = configureDefaultMaven(); + m.setMaven( mavenInstallation.getName() ); + m.getReporters().add(new TestReporter()); + m.setScm(new ExtractResourceSCM(getClass().getResource("incorrect-inheritence-testcase.zip"))); + m.setGoals( "clean validate" ); + MavenModuleSetBuild mmsb = buildAndAssertSuccess(m); + assertFalse( mmsb.getProject().getModules().isEmpty()); + } + + private static class TestReporter extends MavenReporter { + @Override + public boolean end(MavenBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + assertNotNull(build.getProject().getWorkspace()); + assertNotNull(build.getWorkspace()); + return true; + } + } + } diff --git a/test/src/test/resources/hudson/maven/incorrect-inheritence-testcase.zip b/test/src/test/resources/hudson/maven/incorrect-inheritence-testcase.zip new file mode 100755 index 0000000000000000000000000000000000000000..0a30bcca61d4003e96117ceb532d736c6669c095 Binary files /dev/null and b/test/src/test/resources/hudson/maven/incorrect-inheritence-testcase.zip differ