maven-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Bisser (JIRA)" <j...@codehaus.org>
Subject [jira] Commented: (MNG-5156) org.sonatype.aether.util.graph.transformer.JavaEffectiveScopeCalculator doesn't take into account direct vs. transitive dependencies
Date Tue, 16 Aug 2011 20:11:33 GMT

    [ https://jira.codehaus.org/browse/MNG-5156?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=276097#comment-276097
] 

Bisser commented on MNG-5156:
-----------------------------

Sorry, the whitespace got completely destroyed. I'm reposting it again:

When calculating the scope of a dependency, Maven should assign to direct dependencies higher
priority than transitive dependencies.

For example:

{noformat}
com.acme:root:jar:1.0.0
+- com.acme:test-framework:jar:1.0.0:test                 <<<<<<<<<<<<<
direct dependency
\- com.acme:another-module:jar:1.0.0:compile
   \- com.acme:test-framework:jar:1.0.0:compile           <<<<<<<<<<<<<
transitive dependency
{noformat}

We can see that the 'root' project references test-framework directly with scope 'test'. However,
the same test-framework also has a 'compile' scope, but via a transitive dependency. I believe
that the final scope should be 'test' -- that's the explicit desire of the author of project
'root'.

However, when I do roughly the following:

{noformat}
   ProjectBuilder projectBuilder = plexusContainer.lookup(ProjectBuilder.class);
   ProjectBuildingRequest projectBuildingRequest = ....;
   projectBuildingRequest.setResolveDependencies(true);
   ...
   ProjectBuildingResult result = projectBuilder.build(pom, projectBuildingRequest);
   MavenProject proj = result.getProject();
   ...
   Set<Artifact> artifacts = proj.getArtifacts();
{noformat}
The 'test-framework' Artifact has a scope of 'compile'!!! (I will provide more code, if you'd
like.)

After some debugging to find out the reason for this, I reached class org.sonatype.aether.util.graph.transformer.JavaEffectiveScopeCalculator.
There, in method chooseEffectiveScope, there's the following code:

{noformat}
        else if ( scopes.contains( JavaScopes.COMPILE ) )
        {
            effectiveScope = JavaScopes.COMPILE;
        }
{noformat}

So, no attention is paid whether the dependency is direct or transitive. If there's *any*
dependency with scope 'compile', then the conflict is resolved by setting the final scope
to 'compile'. But, as I said above, I believe the final scope should be 'test'.

Here's a relevant stack trace for Maven 3.0.3:

{noformat}
JavaEffectiveScopeCalculator.chooseEffectiveScope(Set<String>) line: 220	
JavaEffectiveScopeCalculator.resolve(ConflictGroup, Map<?,?>, Set<?>) line: 139

JavaEffectiveScopeCalculator.transformGraph(DependencyNode, DependencyGraphTransformationContext)
line: 92	
ChainedDependencyGraphTransformer.transformGraph(DependencyNode, DependencyGraphTransformationContext)
line: 75	
DefaultDependencyCollector.collectDependencies(RepositorySystemSession, CollectRequest) line:
253	
DefaultRepositorySystem.collectDependencies(RepositorySystemSession, CollectRequest) line:
345	
DefaultProjectDependenciesResolver.resolve(DependencyResolutionRequest) line: 131	
DefaultProjectBuilder.build(File, ModelSource, DefaultProjectBuilder$InternalConfig) line:
166	
DefaultProjectBuilder.build(ModelSource, ProjectBuildingRequest) line: 108	
.
.
.
{noformat}

By the way, the Dependency Plugin reports this:

{noformat}
...
+- com.acme:test-framework:jar:1.0.0:test (scope not updated to compile)
{noformat}

The plugin resolves the conflict properly! The scope remains 'test', it's not set to 'compile'.

I detected this problem with versions 3.0.3 and 3.0.2. It might be present in other versions
too but I didn't bother to check any more versions.

> org.sonatype.aether.util.graph.transformer.JavaEffectiveScopeCalculator doesn't take
into account direct vs. transitive dependencies
> ------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: MNG-5156
>                 URL: https://jira.codehaus.org/browse/MNG-5156
>             Project: Maven 2 & 3
>          Issue Type: Bug
>          Components: Dependencies
>    Affects Versions: 3.0.2, 3.0.3
>         Environment: Irrelevant (I debugged the code and I provide an exact location
of the problem)
>            Reporter: Bisser
>            Priority: Minor
>
> When calculating the scope of a dependency, Maven should assign to direct dependencies
higher priority than transitive dependencies.
> For example:
> com.acme:root:jar:1.0.0
> +- com.acme:test-framework:jar:1.0.0:test                 <<<<<<<<<<<<<
direct dependency
> \- com.acme:another-module:jar:1.0.0:compile
>    \- com.acme:test-framework:jar:1.0.0:compile           <<<<<<<<<<<<<
transitive dependency
> We can see that the 'root' project references test-framework directly with scope 'test'.
However, the same test-framework also has a 'compile' scope, but via a transitive dependency.
I believe that the final scope should be 'test' -- that's the explicit desire of the author
of project 'root'.
> However, when I do roughly the following:
>    ProjectBuilder projectBuilder = plexusContainer.lookup(ProjectBuilder.class);
>    ProjectBuildingRequest projectBuildingRequest = ....;
>    projectBuildingRequest.setResolveDependencies(true);
>    ...
>    ProjectBuildingResult result = projectBuilder.build(pom, projectBuildingRequest);
>    MavenProject proj = result.getProject();
>    ...
>    Set<Artifact> artifacts = proj.getArtifacts();
> The 'test-framework' Artifact has a scope of 'compile'!!! (I will provide more code,
if you'd like.)
> After some debugging to find out the reason for this, I reached class org.sonatype.aether.util.graph.transformer.JavaEffectiveScopeCalculator.
There, in method chooseEffectiveScope, there's the following code:
>         else if ( scopes.contains( JavaScopes.COMPILE ) )
>         {
>             effectiveScope = JavaScopes.COMPILE;
>         }
> So, no attention is paid whether the dependency is direct or transitive. If there's *any*
dependency with scope 'compile', then the conflict is resolved by setting the final scope
to 'compile'. But, as I said above, I believe the final scope should be 'test'.
> Here's a relevant stack trace:
> JavaEffectiveScopeCalculator.chooseEffectiveScope(Set<String>) line: 220	
> JavaEffectiveScopeCalculator.resolve(ConflictGroup, Map<?,?>, Set<?>) line:
139	
> JavaEffectiveScopeCalculator.transformGraph(DependencyNode, DependencyGraphTransformationContext)
line: 92	
> ChainedDependencyGraphTransformer.transformGraph(DependencyNode, DependencyGraphTransformationContext)
line: 75	
> DefaultDependencyCollector.collectDependencies(RepositorySystemSession, CollectRequest)
line: 253	
> DefaultRepositorySystem.collectDependencies(RepositorySystemSession, CollectRequest)
line: 345	
> DefaultProjectDependenciesResolver.resolve(DependencyResolutionRequest) line: 131	
> DefaultProjectBuilder.build(File, ModelSource, DefaultProjectBuilder$InternalConfig)
line: 166	
> DefaultProjectBuilder.build(ModelSource, ProjectBuildingRequest) line: 108	
> .
> .
> .
> By the way, the Dependency Plugin reports this:
> ...
> +- com.acme:test-framework:jar:1.0.0:test (scope not updated to compile)
> The plugin resolves the conflict properly! The scope remains 'test', it's not set to
'compile'.
> I detected this problem with versions 3.0.3 and 3.0.2. It might be present in other versions
too but I didn't bother to check any more versions.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Mime
View raw message