Author: bentmann Date: Sat May 9 18:33:08 2009 New Revision: 773258 URL: http://svn.apache.org/viewvc?rev=773258&view=rev Log: o Fixed scope handling during transitive dependency resolution
Added: maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml (with props) Modified: maven/components/branches/MNG-2766/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/ProjectClasspathTest.java Modified: maven/components/branches/MNG-2766/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java URL: http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java?rev=773258&r1=773257&r2=773258&view=diff ============================================================================== --- maven/components/branches/MNG-2766/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java (original) +++ maven/components/branches/MNG-2766/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java Sat May 9 18:33:08 2009 @@ -382,7 +382,7 @@ } catch ( ComponentLookupException e ) { - // Won't happen + throw new IllegalStateException( "Failed to lookup metadata source implementation", e ); } } Modified: maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java URL: http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java?rev=773258&r1=773257&r2=773258&view=diff ============================================================================== --- maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java (original) +++ maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java Sat May 9 18:33:08 2009 @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -30,10 +31,9 @@ import org.apache.maven.artifact.repository.metadata.RepositoryMetadata; import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager; import org.apache.maven.artifact.repository.metadata.RepositoryMetadataResolutionException; -import org.apache.maven.artifact.resolver.filter.ArtifactFilter; -import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter; import org.apache.maven.artifact.versioning.ArtifactVersion; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; +import org.apache.maven.model.Dependency; import org.apache.maven.project.DefaultProjectBuilderConfiguration; import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectBuilder; @@ -87,20 +87,22 @@ project = projectBuilder.buildFromRepository( pomArtifact, configuration ); if ( !artifact.getArtifactHandler().isIncludesDependencies() ) - { - ArtifactFilter filter; - if ( artifact.getScope() == null ) - { - filter = null; - } - else + { + artifacts = new LinkedHashSet<Artifact>(); + + for ( Dependency d : project.getDependencies() ) { - filter = new ScopeArtifactFilter( artifact.getScope() ); + String effectiveScope = getEffectiveScope( d.getScope(), artifact.getScope() ); + + if ( effectiveScope != null ) + { + Artifact dependencyArtifact = + repositorySystem.createArtifact( d.getGroupId(), d.getArtifactId(), d.getVersion(), + effectiveScope, d.getType() ); + + artifacts.add( dependencyArtifact ); + } } - - artifacts = project.createArtifacts( filter ); - - project.setArtifacts( artifacts ); } } catch ( ProjectBuildingException e ) @@ -114,6 +116,47 @@ return new ResolutionGroup( pomArtifact, artifacts, remoteRepositories ); } + private String getEffectiveScope( String originalScope, String inheritedScope ) + { + String effectiveScope = Artifact.SCOPE_RUNTIME; + + if ( originalScope == null ) + { + originalScope = Artifact.SCOPE_COMPILE; + } + + if ( inheritedScope == null ) + { + // direct dependency retains its scope + effectiveScope = originalScope; + } + else if ( Artifact.SCOPE_TEST.equals( originalScope ) || Artifact.SCOPE_PROVIDED.equals( originalScope ) ) + { + // test and provided are not transitive, so exclude them + effectiveScope = null; + } + else if ( Artifact.SCOPE_SYSTEM.equals( originalScope ) ) + { + // system scope come through unchanged... + effectiveScope = Artifact.SCOPE_SYSTEM; + } + else if ( Artifact.SCOPE_COMPILE.equals( originalScope ) && Artifact.SCOPE_COMPILE.equals( inheritedScope ) ) + { + // added to retain compile scope. Remove if you want compile inherited as runtime + effectiveScope = Artifact.SCOPE_COMPILE; + } + else if ( Artifact.SCOPE_TEST.equals( inheritedScope ) ) + { + effectiveScope = Artifact.SCOPE_TEST; + } + else if ( Artifact.SCOPE_PROVIDED.equals( inheritedScope ) ) + { + effectiveScope = Artifact.SCOPE_PROVIDED; + } + + return effectiveScope; + } + public List<ArtifactVersion> retrieveAvailableVersions( Artifact artifact, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories ) throws ArtifactMetadataRetrievalException { @@ -166,4 +209,5 @@ return versions; } + } Modified: maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java URL: http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java?rev=773258&r1=773257&r2=773258&view=diff ============================================================================== --- maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java (original) +++ maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java Sat May 9 18:33:08 2009 @@ -79,8 +79,8 @@ return markerFile.getAbsoluteFile().getParentFile(); } - protected File getFileForClasspathResource( String resource ) - throws FileNotFoundException, URISyntaxException + protected static File getFileForClasspathResource( String resource ) + throws FileNotFoundException { ClassLoader cloader = Thread.currentThread().getContextClassLoader(); @@ -91,7 +91,7 @@ throw new FileNotFoundException( "Unable to find: " + resource ); } - return new File( new URI( resourceUrl.toString().replaceAll( " ", "%20" ) ) ); + return new File( URI.create( resourceUrl.toString().replaceAll( " ", "%20" ) ) ); } protected ArtifactRepository getLocalRepository() Modified: maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/ProjectClasspathTest.java URL: http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/ProjectClasspathTest.java?rev=773258&r1=773257&r2=773258&view=diff ============================================================================== --- maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/ProjectClasspathTest.java (original) +++ maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/ProjectClasspathTest.java Sat May 9 18:33:08 2009 @@ -20,26 +20,39 @@ */ import java.io.File; +import java.io.FileNotFoundException; import java.util.Iterator; +import java.util.List; import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException; +import org.apache.maven.artifact.metadata.ResolutionGroup; +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.project.artifact.MavenMetadataSource; public class ProjectClasspathTest extends AbstractMavenProjectTestCase { - private String dir = "projects/scope/"; - - public void setUp() throws Exception - { - super.setUp(); - projectBuilder = lookup(MavenProjectBuilder.class, "test"); - } - + private static final String dir = "projects/scope/"; + + public void setUp() + throws Exception + { + super.setUp(); + projectBuilder = lookup( MavenProjectBuilder.class, "default" ); + } + + @Override + protected String getCustomConfigurationName() + { + return null; + } + public void testProjectClasspath() throws Exception { File f = getFileForClasspathResource( dir + "project-with-scoped-dependencies.xml" ); - + MavenProject project = getProjectWithDependencies( f ); Artifact artifact; @@ -59,8 +72,8 @@ assertNull( "Check no test dependencies are transitive", artifact ); artifact = getArtifact( project, "maven-test-test", "scope-compile" ); - assertNotNull(artifact); - + assertNotNull( artifact ); + System.out.println( "a = " + artifact ); System.out.println( "b = " + artifact.getScope() ); assertEquals( "Check scope", "test", artifact.getScope() ); @@ -107,23 +120,72 @@ { String artifactId = "scope-" + scope; Artifact artifact = getArtifact( project, "maven-test", artifactId ); + assertNotNull( artifact ); assertEquals( "Check scope", scopeValue, artifact.getScope() ); } private Artifact getArtifact( MavenProject project, String groupId, String artifactId ) - { - System.out.println( "[ Looking for " + groupId + ":" + artifactId + " ]"); - for ( Iterator i = project.getArtifacts().iterator(); i.hasNext(); ) + { + System.out.println( "[ Looking for " + groupId + ":" + artifactId + " ]" ); + for ( Iterator<Artifact> i = project.getArtifacts().iterator(); i.hasNext(); ) { - Artifact a = (Artifact) i.next(); - System.out.println(a.toString()); + Artifact a = i.next(); + System.out.println( a.toString() ); if ( artifactId.equals( a.getArtifactId() ) && a.getGroupId().equals( groupId ) ) { - System.out.println("RETURN"); + System.out.println( "RETURN" ); return a; } } - System.out.println("Return null"); + System.out.println( "Return null" ); return null; } + + public static class TestMavenProjectBuilder + extends DefaultMavenProjectBuilder + { + + @Override + public MavenProject buildFromRepository( Artifact artifact, ProjectBuilderConfiguration configuration ) + throws ProjectBuildingException + { + if ( "maven-test".equals( artifact.getGroupId() ) ) + { + String scope = artifact.getArtifactId().substring( "scope-".length() ); + try + { + artifact.setFile( getFileForClasspathResource( dir + "transitive-" + scope + "-dep.xml" ) ); + } + catch ( FileNotFoundException e ) + { + throw new IllegalStateException( "Missing test POM for " + artifact ); + } + } + if ( artifact.getFile() == null ) + { + return new MavenProject(); + } + return build( artifact.getFile(), configuration ); + } + } + + public static class MetadataSource + extends MavenMetadataSource + { + + @Override + public ResolutionGroup retrieve( Artifact artifact, ArtifactRepository localRepository, + List<ArtifactRepository> remoteRepositories ) + throws ArtifactMetadataRetrievalException + { + ResolutionGroup rg = super.retrieve( artifact, localRepository, remoteRepositories ); + for ( Artifact a : rg.getArtifacts() ) + { + a.setResolved( true ); + } + return rg; + } + + } + } Added: maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml URL: http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml?rev=773258&view=auto ============================================================================== --- maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml (added) +++ maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml Sat May 9 18:33:08 2009 @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<plexus> + <components> + <component> + <role>org.apache.maven.project.MavenProjectBuilder</role> + <role-hint>default</role-hint> + <implementation>org.apache.maven.project.ProjectClasspathTest$TestMavenProjectBuilder</implementation> + <isolated-realm>false</isolated-realm> + <requirements> + <requirement> + <role>org.codehaus.plexus.logging.Logger</role> + <role-hint>default</role-hint> + <field-name>logger</field-name> + </requirement> + <requirement> + <role>org.apache.maven.project.validation.ModelValidator</role> + <role-hint>default</role-hint> + <field-name>validator</field-name> + </requirement> + <requirement> + <role>org.apache.maven.lifecycle.LifecycleExecutor</role> + <role-hint>default</role-hint> + <field-name>lifecycle</field-name> + </requirement> + <requirement> + <role>org.apache.maven.repository.RepositorySystem</role> + <role-hint>default</role-hint> + <field-name>repositorySystem</field-name> + </requirement> + <requirement> + <role>java.util.List</role> + <field-name>listeners</field-name> + </requirement> + <requirement> + <role>org.apache.maven.model.interpolator.Interpolator</role> + <role-hint>default</role-hint> + <field-name>interpolator</field-name> + </requirement> + <requirement> + <role>org.apache.maven.artifact.resolver.ResolutionErrorHandler</role> + <role-hint>default</role-hint> + <field-name>resolutionErrorHandler</field-name> + </requirement> + </requirements> + </component> + <component> + <role>org.apache.maven.artifact.metadata.ArtifactMetadataSource</role> + <role-hint>default</role-hint> + <implementation>org.apache.maven.project.ProjectClasspathTest$MetadataSource</implementation> + <requirements> + <requirement> + <role>org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager</role> + <role-hint>default</role-hint> + <field-name>repositoryMetadataManager</field-name> + </requirement> + <requirement> + <role>org.apache.maven.repository.RepositorySystem</role> + <role-hint>default</role-hint> + <field-name>repositorySystem</field-name> + </requirement> + <requirement> + <role>org.apache.maven.project.MavenProjectBuilder</role> + <role-hint>default</role-hint> + <field-name>projectBuilder</field-name> + </requirement> + <requirement> + <role>org.codehaus.plexus.logging.Logger</role> + <role-hint>default</role-hint> + <field-name>logger</field-name> + </requirement> + </requirements> + </component> + <component> + <role>org.apache.maven.lifecycle.LifecycleExecutor</role> + <implementation>org.apache.maven.project.EmptyLifecycleExecutor</implementation> + </component> + </components> +</plexus> Propchange: maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision