提交 b84efb90 编写于 作者: O Olivier Lamy

[HUDSON-8390] POMs parsing fails in m2 projects which has a wrong inheritence (m3 constraint)

add a workaround ONLY for maven2 builds
上级 724890d7
......@@ -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;
}
}
......@@ -1078,21 +1078,40 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven
// FIXME handle 3.1 level when version will be here : no rush :-)
// or made something configurable tru the ui ?
ReactorReader reactorReader = null;
boolean maven3OrLater = new ComparableVersion (mavenVersion).compareTo( new ComparableVersion ("3.0") ) >= 0;
if (maven3OrLater)
if (maven3OrLater) {
mavenEmbedderRequest.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_0 );
} else {
reactorReader = new ReactorReader( new HashMap<String, MavenProject>(), new File(workspaceProper) );
mavenEmbedderRequest.setWorkspaceReader( reactorReader );
}
//mavenEmbedderRequest.setClassLoader( MavenEmbedderUtils.buildClassRealm( mavenHome.getHomeDir(), null, null ) );
MavenEmbedder embedder = MavenUtil.createEmbedder( mavenEmbedderRequest );
List<MavenProject> mps = embedder.readProjects( pom,true);
MavenProject rootProject = null;
List<MavenProject> mps = new ArrayList<MavenProject>(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<String,MavenProject> canonicalPaths = new HashMap<String, MavenProject>( 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<MavenModuleSet,Maven
}
Set<PomInfo> infos = new LinkedHashSet<PomInfo>();
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<MavenModuleSet,Maven
toPomInfo(child,pi,abslPath,infos);
}
}
private void readChilds(MavenProject mp, MavenEmbedder mavenEmbedder, List<MavenProject> 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;
}
......
......@@ -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());
......
......@@ -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());
}
......
......@@ -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;
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册