[ http://jira.codehaus.org/browse/MNG-3090?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_101625 ]
Christian Schulte commented on MNG-3090: ---------------------------------------- Reading http://docs.codehaus.org/x/IGU#DependencyMediationandConflictResolution-Scoperesolution I think that since the dependency management can now be used to control scopes and versions of all dependencies, including transitive dependencies, scope updates can simply be discarded. I took a look at various issues regarding transitive dependencies and this scope update thing really seems to be a work around for the missing manageArtifact() from the dependency management in previous releases. Also looking at all the changes of DefaultArtifactCollector I think updating the scope only was needed since dependency management could not be used ? What people were requesting was exactly what the testcase does. Getting a farther transitive dependency when the nearer would be excluded for some reason when the farther would not. Also, if I get it right, the current code seems to not do, what the comments in the code state. Look at these code snippets from DefaultArtifactCollector: if ( checkScopeUpdate( farthest, nearest, listeners ) ) { Its the following comment which is confusing. It talks about an updated scope of the nearest artifact but then disables this updated node in favour of the farther! // if we need to update scope of nearest to use farthest scope, use the nearest version, but farthest scope nearest.disable(); <-- gets disabled although the scope got updated in checkScopeUpdate() farthest.getArtifact().setVersion( nearest.getArtifact().getVersion() ); <-- nearest version is used and farthest scope since the farthest node is used, so the nearest node's scope would not have to get updated anyways ? fireEvent( ResolutionListener.OMIT_FOR_NEARER, listeners, nearest, farthest.getArtifact() ); } and in checkScopeUpdate(): if ( updateScope ) { fireEvent( ResolutionListener.UPDATE_SCOPE, listeners, nearest, farthestArtifact ); nearestArtifact.setScope( farthestArtifact.getScope() ); } So when in checkScopeUpdate() the condition to update the scope is true, the scope of the nearest artifact gets updated to the scope of the farthest - but in the code calling checkScopeUpdate the updated nearest node will not get used and gets disabled when this same condition holds true. This makes me think that the updated scope of the nearest node never played any role since the node gets disabled in favour of the farther which has the same scope the nearer got updated with. If I get it right the whole checkScopeUpdate() method could be discarded then and the node.filterTrail() method could be used similarly as done in my patch. Can someone please explain why this scope update thing got introduced and for what exactly it was needed ? Currently nodes which got theire scope updated will actually not get used so there really is no scope updating happening! It seems that it can be discarded in favour of node.filterTrail() without braking existing builds then. Looking at the code of DefaultArtifactCollector it seems that a node which got disabled once, will never get enabled again. If this is true, the checkScopeUpdate() method could be removed since all it does was forcing an update of the version of a farther node to the version of a nearer. Nearest version wins, but farther node gets used with the updated version of the nearer node. That's what the patch does when checkScopeUpdate() returns false. All it would have to do additionally would be to also update the version of the farther node with the one from the nearer, which it currently does not. I will prepare another patch for review. > Nearest dependency, which is not included by a filter, wins, although a > farthest dependency, which is included by the same filter, does not win. > ------------------------------------------------------------------------------------------------------------------------------------------------ > > Key: MNG-3090 > URL: http://jira.codehaus.org/browse/MNG-3090 > Project: Maven 2 > Issue Type: Improvement > Components: Artifacts and Repositories > Affects Versions: 2.0.7 > Reporter: Christian Schulte > Attachments: maven-artifact-2.0.x.patch, testcase.tar.bz2 > > > There seems to be a problem with transitive dependencies and the nearest wins > strategy. The nearest dependency wins, although a filter is in use which will > not include that dependency when there is the same dependency at a deeper > level, where it is included by the same filter. The nearest dependency gets > discarded (e.g. is missing on the compile classpath) although the farthest > dependency would have been included. Please see the comments in the attached > patch. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://jira.codehaus.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira