Author: bentmann Date: Wed May 14 13:59:56 2008 New Revision: 656430 URL: http://svn.apache.org/viewvc?rev=656430&view=rev Log: [MINVOKER-37] Stage Reactor Contents to IT Repo
Modified: maven/plugins/trunk/maven-invoker-plugin/src/main/java/org/apache/maven/plugin/invoker/InstallMojo.java Modified: maven/plugins/trunk/maven-invoker-plugin/src/main/java/org/apache/maven/plugin/invoker/InstallMojo.java URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-invoker-plugin/src/main/java/org/apache/maven/plugin/invoker/InstallMojo.java?rev=656430&r1=656429&r2=656430&view=diff ============================================================================== --- maven/plugins/trunk/maven-invoker-plugin/src/main/java/org/apache/maven/plugin/invoker/InstallMojo.java (original) +++ maven/plugins/trunk/maven-invoker-plugin/src/main/java/org/apache/maven/plugin/invoker/InstallMojo.java Wed May 14 13:59:56 2008 @@ -21,7 +21,9 @@ import java.io.File; import java.util.Collection; +import java.util.HashMap; import java.util.Iterator; +import java.util.Map; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; @@ -35,12 +37,14 @@ import org.apache.maven.project.MavenProject; /** - * Installs the project artifacts into the local repository as a preparation to run the integration tests. + * Installs the project artifacts into the local repository as a preparation to run the integration tests. More + * precisely, all artifacts of the project itself, all its locally reachable parent POMs and all its dependencies from + * the reactor will be installed to the local repository. * * @goal install * @phase pre-integration-test + * @requiresDependencyResolution runtime * @since 1.2 - * * @author Paul Gier * @author Benjamin Bentmann * @version $Id$ @@ -79,7 +83,9 @@ /** * The path to the local repository into which the project artifacts should be installed for the integration tests. - * If not set, the regular local repository will be used. + * If not set, the regular local repository will be used. To prevent soiling of your regular local repository with + * possibly broken artifacts, it is strongly recommended to use an isolated repository for the integration tests + * (e.g. <code>${project.build.directory}/it-repo</code>). * * @parameter expression="${invoker.localRepositoryPath}" */ @@ -95,37 +101,79 @@ private MavenProject project; /** + * The set of Maven projects in the reactor build. + * + * @parameter default-value="${reactorProjects}" + * @readonly + */ + private Collection reactorProjects; + + /** * Performs this mojo's tasks. */ public void execute() throws MojoExecutionException, MojoFailureException { ArtifactRepository testRepository = createTestRepository(); - installProjectArtifacts( testRepository ); + installProjectArtifacts( project, testRepository ); + installProjectParents( project, testRepository ); + installProjectDependencies( project, reactorProjects, testRepository ); + } + + /** + * Creates the local repository for the integration tests. + * + * @return The local repository for the integration tests, never <code>null</code>. + * @throws MojoExecutionException If the repository could not be created. + */ + private ArtifactRepository createTestRepository() + throws MojoExecutionException + { + ArtifactRepository testRepository = localRepository; + + if ( localRepositoryPath != null ) + { + try + { + if ( !localRepositoryPath.exists() ) + { + localRepositoryPath.mkdirs(); + } + + testRepository = + repositoryFactory.createArtifactRepository( "it-repo", localRepositoryPath.toURL().toString(), + localRepository.getLayout(), + localRepository.getSnapshots(), + localRepository.getReleases() ); + } + catch ( Exception e ) + { + throw new MojoExecutionException( "Failed to create local repository: " + localRepositoryPath, e ); + } + } + + return testRepository; } /** - * Installs the main project artifact and any attached artifacts to the local repository. + * Installs the main artifact and any attached artifacts of the specified project to the local repository. * - * @param testRepository The local repository to install the artifacts into, must not be <code>null</code>. + * @param mvnProject The project whose artifacts should be installed, must not be <code>null</code>. + * @param testRepository The local repository to install the artifacts to, must not be <code>null</code>. * @throws MojoExecutionException If any artifact could not be installed. */ - private void installProjectArtifacts( ArtifactRepository testRepository ) + private void installProjectArtifacts( MavenProject mvnProject, ArtifactRepository testRepository ) throws MojoExecutionException { try { - // Install the pom - Artifact pomArtifact = - artifactFactory.createArtifact( project.getGroupId(), project.getArtifactId(), project.getVersion(), - null, "pom" ); - installer.install( project.getFile(), pomArtifact, testRepository ); + installProjectPom( mvnProject, testRepository ); // Install the main project artifact - installer.install( project.getArtifact().getFile(), project.getArtifact(), testRepository ); + installer.install( mvnProject.getArtifact().getFile(), mvnProject.getArtifact(), testRepository ); // Install any attached project artifacts - Collection attachedArtifacts = project.getAttachedArtifacts(); + Collection attachedArtifacts = mvnProject.getAttachedArtifacts(); for ( Iterator artifactIter = attachedArtifacts.iterator(); artifactIter.hasNext(); ) { Artifact theArtifact = (Artifact) artifactIter.next(); @@ -134,43 +182,86 @@ } catch ( ArtifactInstallationException e ) { - throw new MojoExecutionException( "Failed to install project artifacts", e ); + throw new MojoExecutionException( "Failed to install project artifacts: " + mvnProject, e ); } } /** - * Creates the local repository for the integration tests. + * Installs the (locally reachable) parent POMs of the specified project to the local repository. The parent POMs + * from the reactor must be installed or the forked IT builds will fail when using a clean repository. * - * @return The local repository for the integration tests, never <code>null</code>. - * @throws MojoExecutionException If the repository could not be created. + * @param mvnProject The project whose parent POMs should be installed, must not be <code>null</code>. + * @param testRepository The local repository to install the POMs to, must not be <code>null</code>. + * @throws MojoExecutionException If any POM could not be installed. */ - private ArtifactRepository createTestRepository() + private void installProjectParents( MavenProject mvnProject, ArtifactRepository testRepository ) throws MojoExecutionException { - ArtifactRepository testRepository = localRepository; - - if ( localRepositoryPath != null ) + for ( MavenProject parent = mvnProject.getParent(); parent != null; parent = parent.getParent() ) { - try + if ( parent.getFile() == null ) { - if ( !localRepositoryPath.exists() ) - { - localRepositoryPath.mkdirs(); - } - - testRepository = - repositoryFactory.createArtifactRepository( "it-repo", localRepositoryPath.toURL().toString(), - localRepository.getLayout(), - localRepository.getSnapshots(), - localRepository.getReleases() ); + break; } - catch ( Exception e ) + installProjectPom( parent, testRepository ); + } + } + + /** + * Installs the POM of the specified project to the local repository. + * + * @param mvnProject The project whose POM should be installed, must not be <code>null</code>. + * @param testRepository The local repository to install the POM to, must not be <code>null</code>. + * @throws MojoExecutionException If the POM could not be installed. + */ + private void installProjectPom( MavenProject mvnProject, ArtifactRepository testRepository ) + throws MojoExecutionException + { + try + { + Artifact pomArtifact = + artifactFactory.createProjectArtifact( mvnProject.getGroupId(), mvnProject.getArtifactId(), + mvnProject.getVersion() ); + installer.install( mvnProject.getFile(), pomArtifact, testRepository ); + } + catch ( Exception e ) + { + throw new MojoExecutionException( "Failed to install POM: " + mvnProject, e ); + } + } + + /** + * Installs the dependent projects from the reactor to the local repository. The dependencies on other modules from + * the reactor must be installed or the forked IT builds will fail when using a clean repository. + * + * @param mvnProject The project whose dependent projects should be installed, must not be <code>null</code>. + * @param reactorProjects The set of projects in the reactor build, must not be <code>null</code>. + * @param testRepository The local repository to install the POMs to, must not be <code>null</code>. + * @throws MojoExecutionException If any dependency could not be installed. + */ + private void installProjectDependencies( MavenProject mvnProject, Collection reactorProjects, + ArtifactRepository testRepository ) + throws MojoExecutionException + { + Map projects = new HashMap(); + for ( Iterator it = reactorProjects.iterator(); it.hasNext(); ) + { + MavenProject reactorProject = (MavenProject) it.next(); + projects.put( reactorProject.getId(), reactorProject ); + } + + for ( Iterator it = mvnProject.getArtifacts().iterator(); it.hasNext(); ) + { + Artifact artifact = (Artifact) it.next(); + String id = + artifact.getGroupId() + ':' + artifact.getArtifactId() + ':' + artifact.getType() + ':' + + artifact.getVersion(); + MavenProject requiredProject = (MavenProject) projects.remove( id ); + if ( requiredProject != null ) { - throw new MojoExecutionException( "Failed to create local repository", e ); + installProjectArtifacts( requiredProject, testRepository ); } } - - return testRepository; } }