[MNG-5988] Dependency mediation should prioritize transitive dependencies based on scope.
Project: http://git-wip-us.apache.org/repos/asf/maven/repo Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/bec76204 Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/bec76204 Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/bec76204 Branch: refs/heads/MNG-6006 Commit: bec762043f0d900a471d49de3a3ac7cef096e401 Parents: d7967a5 Author: Christian Schulte <schu...@apache.org> Authored: Fri Jul 1 16:41:52 2016 +0200 Committer: Christian Schulte <schu...@apache.org> Committed: Fri Jul 1 19:25:15 2016 +0200 ---------------------------------------------------------------------- .../internal/MavenRepositorySystemUtils.java | 7 +- .../maven/project/ProjectClasspathTest.java | 124 +++++++++++++------ .../projects/scope/transitive-compile-dep.xml | 8 +- .../projects/scope/transitive-default-dep.xml | 7 +- .../projects/scope/transitive-provided-dep.xml | 8 +- .../projects/scope/transitive-runtime-dep.xml | 7 +- .../projects/scope/transitive-test-dep.xml | 7 +- 7 files changed, 121 insertions(+), 47 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/maven/blob/bec76204/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java ---------------------------------------------------------------------- diff --git a/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java b/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java index b0b0a8d..cd15a85 100644 --- a/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java +++ b/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java @@ -41,6 +41,7 @@ import org.eclipse.aether.util.graph.selector.ScopeDependencySelector; import org.eclipse.aether.util.graph.transformer.ChainedDependencyGraphTransformer; import org.eclipse.aether.util.graph.transformer.ConflictResolver; import org.eclipse.aether.util.graph.transformer.JavaDependencyContextRefiner; +import org.eclipse.aether.util.graph.transformer.JavaDependencyMediator; import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver; import org.eclipse.aether.util.graph.transformer.JavaScopeSelector; import org.eclipse.aether.util.graph.transformer.NearestVersionSelector; @@ -103,12 +104,12 @@ public final class MavenRepositorySystemUtils new OptionalDependencySelector(), new ExclusionDependencySelector() ); session.setDependencySelector( depFilter ); - DependencyGraphTransformer transformer = + DependencyGraphTransformer conflictResolver = new ConflictResolver( new NearestVersionSelector(), new JavaScopeSelector(), new SimpleOptionalitySelector(), new JavaScopeDeriver() ); - session.setDependencyGraphTransformer( - new ChainedDependencyGraphTransformer( transformer, new JavaDependencyContextRefiner() ) ); + session.setDependencyGraphTransformer( new ChainedDependencyGraphTransformer( + new JavaDependencyMediator(), conflictResolver, new JavaDependencyContextRefiner() ) ); DefaultArtifactTypeRegistry stereotypes = new DefaultArtifactTypeRegistry(); stereotypes.add( new DefaultArtifactType( "pom" ) ); http://git-wip-us.apache.org/repos/asf/maven/blob/bec76204/maven-compat/src/test/java/org/apache/maven/project/ProjectClasspathTest.java ---------------------------------------------------------------------- diff --git a/maven-compat/src/test/java/org/apache/maven/project/ProjectClasspathTest.java b/maven-compat/src/test/java/org/apache/maven/project/ProjectClasspathTest.java index d7ae86e..3463e94 100644 --- a/maven-compat/src/test/java/org/apache/maven/project/ProjectClasspathTest.java +++ b/maven-compat/src/test/java/org/apache/maven/project/ProjectClasspathTest.java @@ -30,13 +30,16 @@ import org.eclipse.aether.impl.ArtifactResolver; public class ProjectClasspathTest extends AbstractMavenProjectTestCase { + static final String dir = "projects/scope/"; public void setUp() throws Exception { ArtifactResolver resolver = lookup( ArtifactResolver.class, "classpath" ); - DefaultArtifactDescriptorReader pomReader = (DefaultArtifactDescriptorReader)lookup(ArtifactDescriptorReader.class); + DefaultArtifactDescriptorReader pomReader = + (DefaultArtifactDescriptorReader) lookup( ArtifactDescriptorReader.class ); + pomReader.setArtifactResolver( resolver ); projectBuilder = lookup( ProjectBuilder.class, "classpath" ); @@ -70,55 +73,98 @@ public class ProjectClasspathTest checkArtifactIdScope( project, "runtime", "runtime" ); checkArtifactIdScope( project, "default", "compile" ); - // check all transitive deps of a test dependency are test, except test and provided which is skipped - artifact = getArtifact( project, "maven-test-test", "scope-provided" ); - assertNull( "Check no provided dependencies are transitive", artifact ); - artifact = getArtifact( project, "maven-test-test", "scope-test" ); - assertNull( "Check no test dependencies are transitive", artifact ); - - artifact = getArtifact( project, "maven-test-test", "scope-compile" ); - assertNotNull( artifact ); - - System.out.println( "a = " + artifact ); - System.out.println( "b = " + artifact.getScope() ); - assertEquals( "Check scope", "test", artifact.getScope() ); + // check transitive dependencies of test scope dependency artifact = getArtifact( project, "maven-test-test", "scope-default" ); - assertEquals( "Check scope", "test", artifact.getScope() ); + assertNull( "Unexpected transitive dependency of test dependency", artifact ); + artifact = getArtifact( project, "maven-test-test", "scope-test" ); + assertNull( "Unexpected transitive dependency of test dependency", artifact ); artifact = getArtifact( project, "maven-test-test", "scope-runtime" ); - assertEquals( "Check scope", "test", artifact.getScope() ); + assertNull( "Unexpected transitive dependency of test dependency", artifact ); + artifact = getArtifact( project, "maven-test-test", "scope-compile" ); + assertNull( "Unexpected transitive dependency of test dependency", artifact ); + artifact = getArtifact( project, "maven-test-test", "scope-provided" ); + assertNull( "Unexpected transitive dependency of test dependency", artifact ); - // check all transitive deps of a provided dependency are provided scope, except for test - checkGroupIdScope( project, "provided", "maven-test-provided" ); + // check transitive dependencies of provided scope dependency + artifact = getArtifact( project, "maven-test-provided", "scope-default" ); + assertNull( "Unexpected transitive dependency of provided dependency", artifact ); + artifact = getArtifact( project, "maven-test-provided", "scope-test" ); + assertNull( "Unexpected transitive dependency of provided dependency", artifact ); artifact = getArtifact( project, "maven-test-provided", "scope-runtime" ); - assertEquals( "Check scope", "provided", artifact.getScope() ); + assertNull( "Unexpected transitive dependency of provided dependency", artifact ); + artifact = getArtifact( project, "maven-test-provided", "scope-compile" ); + assertNull( "Unexpected transitive dependency of provided dependency", artifact ); + artifact = getArtifact( project, "maven-test-provided", "scope-provided" ); + assertNull( "Unexpected transitive dependency of provided dependency", artifact ); + + // check transitive dependencies of runtime scope dependency + artifact = getArtifact( project, "maven-test-runtime", "scope-default" ); + assertNotNull( "Expected transitive dependency", artifact ); + assertEquals( "Expected transitive runtime scope", "runtime", artifact.getScope() ); + + artifact = getArtifact( project, "maven-test-runtime", "scope-test" ); + assertNull( "Unexpected transitive dependency", artifact ); + + artifact = getArtifact( project, "maven-test-runtime", "scope-runtime" ); + assertNotNull( "Expected transitive dependency", artifact ); + assertEquals( "Expected transitive runtime scope", "runtime", artifact.getScope() ); + + artifact = getArtifact( project, "maven-test-runtime", "scope-compile" ); + assertNotNull( "Expected transitive dependency", artifact ); + assertEquals( "Expected transitive runtime scope", "runtime", artifact.getScope() ); + + artifact = getArtifact( project, "maven-test-runtime", "scope-provided" ); + assertNull( "Unexpected transitive dependency", artifact ); - // check all transitive deps of a runtime dependency are runtime scope, except for test - checkGroupIdScope( project, "runtime", "maven-test-runtime" ); artifact = getArtifact( project, "maven-test-runtime", "scope-runtime" ); - assertEquals( "Check scope", "runtime", artifact.getScope() ); + assertNotNull( "Expected transitive dependency", artifact ); + assertEquals( "Expected transitive runtime scope", "runtime", artifact.getScope() ); + + // check transitive dependencies of compile scope dependency + artifact = getArtifact( project, "maven-test-compile", "scope-default" ); + assertNotNull( "Expected transitive dependency", artifact ); + assertEquals( "Expected transitive compile scope", "compile", artifact.getScope() ); + + artifact = getArtifact( project, "maven-test-compile", "scope-test" ); + assertNull( "Unexpected transitive dependency", artifact ); + + artifact = getArtifact( project, "maven-test-compile", "scope-runtime" ); + assertNotNull( "Expected transitive dependency", artifact ); + assertEquals( "Expected transitive runtime scope", "runtime", artifact.getScope() ); + + artifact = getArtifact( project, "maven-test-compile", "scope-compile" ); + assertNotNull( "Expected transitive dependency", artifact ); + assertEquals( "Expected transitive compile scope", "compile", artifact.getScope() ); + + artifact = getArtifact( project, "maven-test-compile", "scope-provided" ); + assertNull( "Unexpected transitive dependency", artifact ); - // check all transitive deps of a compile dependency are compile scope, except for runtime and test - checkGroupIdScope( project, "compile", "maven-test-compile" ); artifact = getArtifact( project, "maven-test-compile", "scope-runtime" ); - assertEquals( "Check scope", "runtime", artifact.getScope() ); + assertNotNull( "Expected transitive dependency", artifact ); + assertEquals( "Expected transitive runtime scope", "runtime", artifact.getScope() ); + + // check transitive dependencies of default scope dependency + artifact = getArtifact( project, "maven-test-default", "scope-default" ); + assertNotNull( "Expected transitive dependency", artifact ); + assertEquals( "Expected transitive compile scope", "compile", artifact.getScope() ); + + artifact = getArtifact( project, "maven-test-default", "scope-test" ); + assertNull( "Unexpected transitive dependency", artifact ); - // check all transitive deps of a default dependency are compile scope, except for runtime and test - checkGroupIdScope( project, "compile", "maven-test-default" ); artifact = getArtifact( project, "maven-test-default", "scope-runtime" ); - assertEquals( "Check scope", "runtime", artifact.getScope() ); - } + assertNotNull( "Expected transitive dependency", artifact ); + assertEquals( "Expected transitive runtime scope", "runtime", artifact.getScope() ); - private void checkGroupIdScope( MavenProject project, String scopeValue, String groupId ) - { - Artifact artifact; - artifact = getArtifact( project, groupId, "scope-compile" ); - assertEquals( "Check scope", scopeValue, artifact.getScope() ); - artifact = getArtifact( project, groupId, "scope-test" ); - assertNull( "Check test dependency is not transitive", artifact ); - artifact = getArtifact( project, groupId, "scope-provided" ); - assertNull( "Check provided dependency is not transitive", artifact ); - artifact = getArtifact( project, groupId, "scope-default" ); - assertEquals( "Check scope", scopeValue, artifact.getScope() ); + artifact = getArtifact( project, "maven-test-default", "scope-compile" ); + assertNotNull( "Expected transitive dependency", artifact ); + assertEquals( "Expected transitive compile scope", "compile", artifact.getScope() ); + + artifact = getArtifact( project, "maven-test-default", "scope-provided" ); + assertNull( "Unexpected transitive dependency", artifact ); + + artifact = getArtifact( project, "maven-test-default", "scope-runtime" ); + assertNotNull( "Expected transitive dependency", artifact ); + assertEquals( "Expected transitive runtime scope", "runtime", artifact.getScope() ); } private void checkArtifactIdScope( MavenProject project, String scope, String scopeValue ) http://git-wip-us.apache.org/repos/asf/maven/blob/bec76204/maven-compat/src/test/resources/projects/scope/transitive-compile-dep.xml ---------------------------------------------------------------------- diff --git a/maven-compat/src/test/resources/projects/scope/transitive-compile-dep.xml b/maven-compat/src/test/resources/projects/scope/transitive-compile-dep.xml index 1161c69..558b53f 100644 --- a/maven-compat/src/test/resources/projects/scope/transitive-compile-dep.xml +++ b/maven-compat/src/test/resources/projects/scope/transitive-compile-dep.xml @@ -52,6 +52,12 @@ under the License. <version>1.0</version> <scope>compile</scope> </dependency> - </dependencies> + <dependency> + <groupId>maven-test-compile</groupId> + <artifactId>scope-provided</artifactId> + <version>1.0</version> + <scope>provided</scope> + </dependency> + </dependencies> </project> http://git-wip-us.apache.org/repos/asf/maven/blob/bec76204/maven-compat/src/test/resources/projects/scope/transitive-default-dep.xml ---------------------------------------------------------------------- diff --git a/maven-compat/src/test/resources/projects/scope/transitive-default-dep.xml b/maven-compat/src/test/resources/projects/scope/transitive-default-dep.xml index c904be0..20c186a 100644 --- a/maven-compat/src/test/resources/projects/scope/transitive-default-dep.xml +++ b/maven-compat/src/test/resources/projects/scope/transitive-default-dep.xml @@ -53,6 +53,11 @@ under the License. <scope>compile</scope> </dependency> + <dependency> + <groupId>maven-test-default</groupId> + <artifactId>scope-provided</artifactId> + <version>1.0</version> + <scope>provided</scope> + </dependency> </dependencies> - </project> http://git-wip-us.apache.org/repos/asf/maven/blob/bec76204/maven-compat/src/test/resources/projects/scope/transitive-provided-dep.xml ---------------------------------------------------------------------- diff --git a/maven-compat/src/test/resources/projects/scope/transitive-provided-dep.xml b/maven-compat/src/test/resources/projects/scope/transitive-provided-dep.xml index b85669c..219218c 100644 --- a/maven-compat/src/test/resources/projects/scope/transitive-provided-dep.xml +++ b/maven-compat/src/test/resources/projects/scope/transitive-provided-dep.xml @@ -52,6 +52,12 @@ under the License. <version>1.0</version> <scope>compile</scope> </dependency> - </dependencies> + <dependency> + <groupId>maven-test-provided</groupId> + <artifactId>scope-provided</artifactId> + <version>1.0</version> + <scope>provided</scope> + </dependency> + </dependencies> </project> http://git-wip-us.apache.org/repos/asf/maven/blob/bec76204/maven-compat/src/test/resources/projects/scope/transitive-runtime-dep.xml ---------------------------------------------------------------------- diff --git a/maven-compat/src/test/resources/projects/scope/transitive-runtime-dep.xml b/maven-compat/src/test/resources/projects/scope/transitive-runtime-dep.xml index 921723c..c63852f 100644 --- a/maven-compat/src/test/resources/projects/scope/transitive-runtime-dep.xml +++ b/maven-compat/src/test/resources/projects/scope/transitive-runtime-dep.xml @@ -53,6 +53,11 @@ under the License. <scope>compile</scope> </dependency> + <dependency> + <groupId>maven-test-runtime</groupId> + <artifactId>scope-provided</artifactId> + <version>1.0</version> + <scope>provided</scope> + </dependency> </dependencies> - </project> http://git-wip-us.apache.org/repos/asf/maven/blob/bec76204/maven-compat/src/test/resources/projects/scope/transitive-test-dep.xml ---------------------------------------------------------------------- diff --git a/maven-compat/src/test/resources/projects/scope/transitive-test-dep.xml b/maven-compat/src/test/resources/projects/scope/transitive-test-dep.xml index ea2dde9..8230d58 100644 --- a/maven-compat/src/test/resources/projects/scope/transitive-test-dep.xml +++ b/maven-compat/src/test/resources/projects/scope/transitive-test-dep.xml @@ -53,6 +53,11 @@ under the License. <scope>compile</scope> </dependency> + <dependency> + <groupId>maven-test-test</groupId> + <artifactId>scope-provided</artifactId> + <version>1.0</version> + <scope>provided</scope> + </dependency> </dependencies> - </project>