diff --git a/src/changes/changes.xml b/src/changes/changes.xml index fe841f73efefe33b0995f0492fd33b1f480ac740..491c00d82d738ead88348bfe0af9ee0807ef5c95 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -17,6 +17,10 @@ due-to-email="brianegge@yahoo.com" issue="MCLIRR-11"> Fixed a documentation typo. + + Resolving the previous artifacts dependencies didn't actually + work. + diff --git a/src/main/java/org/codehaus/mojo/clirr/AbstractClirrMojo.java b/src/main/java/org/codehaus/mojo/clirr/AbstractClirrMojo.java index 9924e8263aada93dd67d94a92866ec3a3a143095..dd4887f39e20089c3b6f691ec5e99451a25ca9f4 100644 --- a/src/main/java/org/codehaus/mojo/clirr/AbstractClirrMojo.java +++ b/src/main/java/org/codehaus/mojo/clirr/AbstractClirrMojo.java @@ -46,6 +46,9 @@ import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.project.MavenProject; +import org.apache.maven.project.MavenProjectBuilder; +import org.apache.maven.project.ProjectBuildingException; +import org.apache.maven.project.artifact.InvalidDependencyVersionException; import org.codehaus.plexus.util.DirectoryScanner; import org.codehaus.plexus.util.IOUtil; @@ -102,8 +105,13 @@ public abstract class AbstractClirrMojo /** * @component */ - protected ArtifactMetadataSource metadataSource; + private ArtifactMetadataSource metadataSource; + /** + * @component + */ + private MavenProjectBuilder mavenProjectBuilder; + /** * The classes of this project to compare the last release against. * @@ -247,19 +255,25 @@ public abstract class AbstractClirrMojo throws MojoFailureException, MojoExecutionException { final Set previousArtifacts; + final Artifact firstPreviousArtifact; if ( comparisonArtifacts == null ) { - Artifact previousArtifact = getComparisonArtifact(); - comparisonVersion = previousArtifact.getVersion(); + firstPreviousArtifact = getComparisonArtifact(); + comparisonVersion = firstPreviousArtifact.getVersion(); getLog().info( "Comparing to version: " + comparisonVersion ); - previousArtifacts = Collections.singleton( previousArtifact ); + previousArtifacts = Collections.singleton( firstPreviousArtifact ); } else { previousArtifacts = resolveArtifacts( comparisonArtifacts ); + Artifact a = null; for ( Iterator iter = previousArtifacts.iterator(); iter.hasNext(); ) { Artifact artifact = (Artifact) iter.next(); + if ( a == null ) + { + a = artifact; + } getLog().debug( "Comparing to " + artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" @@ -267,19 +281,14 @@ public abstract class AbstractClirrMojo + artifact.getClassifier() + ":" + artifact.getType() ); } + firstPreviousArtifact = a; } try { - // TODO: better way? Can't use previousArtifact as the originatingArtifact, it culls everything out - // perhaps resolve the artifact itself (not the pom artifact), then load the pom and get dependencies - Artifact dummy = factory.createProjectArtifact( "dummy", "dummy", "1.0" ); - ArtifactResolutionResult result = resolver.resolveTransitively( previousArtifacts, - dummy, localRepository, - project.getRemoteArtifactRepositories(), - metadataSource, null ); - - ClassLoader origDepCL = createClassLoader( result.getArtifacts(), previousArtifacts ); + final List dependencies = getTransitiveDependencies( previousArtifacts ); + + ClassLoader origDepCL = createClassLoader( dependencies, previousArtifacts ); final File[] files = new File[ previousArtifacts.size() ]; int i = 0; for ( Iterator iter = previousArtifacts.iterator(); iter.hasNext(); ) @@ -289,6 +298,14 @@ public abstract class AbstractClirrMojo } return BcelTypeArrayBuilder.createClassSet( files, origDepCL, classFilter ); } + catch ( ProjectBuildingException e ) + { + throw new MojoExecutionException( "Failed to build project for previous artifact: " + e.getMessage(), e ); + } + catch ( InvalidDependencyVersionException e ) + { + throw new MojoExecutionException( e.getMessage(), e ); + } catch ( ArtifactResolutionException e ) { throw new MissingPreviousException( "Error resolving previous version: " + e.getMessage(), e ); @@ -303,6 +320,34 @@ public abstract class AbstractClirrMojo } } + private List getTransitiveDependencies( final Set previousArtifacts ) + throws ProjectBuildingException, InvalidDependencyVersionException, ArtifactResolutionException, + ArtifactNotFoundException + { + final List dependencies = new ArrayList(); + for ( Iterator iter = previousArtifacts.iterator(); iter.hasNext(); ) + { + final Artifact a = (Artifact) iter.next(); + final Artifact pomArtifact = factory.createArtifact( + a.getGroupId(), + a.getArtifactId(), + a.getVersion(), + a.getScope(), + "pom"); + final MavenProject pomProject = mavenProjectBuilder.buildFromRepository( + pomArtifact, + project.getRemoteArtifactRepositories(), + localRepository ); + final Set pomProjectArtifacts = pomProject.createArtifacts( factory, null, null ); + final ArtifactResolutionResult result = resolver.resolveTransitively( pomProjectArtifacts, + pomArtifact, localRepository, + project.getRemoteArtifactRepositories(), + metadataSource, null ); + dependencies.addAll( result.getArtifacts() ); + } + return dependencies; + } + private Artifact resolveArtifact( ArtifactSpecification artifactSpec ) throws MojoFailureException, MojoExecutionException {