Index: maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java =================================================================== --- maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java (revision 442844) +++ maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java (working copy) @@ -69,6 +69,7 @@ ArtifactResolutionResult result = artifactResolver.resolveTransitively( Collections.singleton( artifact ), project.getArtifact(), + project.getManagedVersionMap(), localRepository, project.getRemoteArtifactRepositories(), artifactMetadataSource, Index: maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java =================================================================== --- maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java (revision 442844) +++ maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java (working copy) @@ -611,6 +611,7 @@ dependencies.addAll( pluginDescriptor.getIntroducedDependencyArtifacts() ); ArtifactResolutionResult result = artifactResolver.resolveTransitively( dependencies, pluginArtifact, + project.getManagedVersionMap(), localRepository, resolutionGroup.getResolutionRepositories(), artifactMetadataSource, @@ -1135,7 +1136,9 @@ project.setDependencyArtifacts( project.createArtifacts( artifactFactory, null, null ) ); } ArtifactResolutionResult result = artifactResolver.resolveTransitively( project.getDependencyArtifacts(), - artifact, context.getLocalRepository(), + artifact, + project.getManagedVersionMap(), + context.getLocalRepository(), project.getRemoteArtifactRepositories(), artifactMetadataSource, filter ); Index: maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ManagedVersionMap.java =================================================================== --- maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ManagedVersionMap.java (revision 0) +++ maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ManagedVersionMap.java (revision 0) @@ -0,0 +1,74 @@ +package org.apache.maven.artifact.versioning; +/* + * Copyright 2001-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.HashMap; +import java.util.Map; +import java.util.Iterator; + +public class ManagedVersionMap extends HashMap +{ + private final boolean override; + + public ManagedVersionMap(boolean override) + { + super(); + this.override = override; + } + + public ManagedVersionMap(Map map, boolean override) + { + super(); + if (map != null) + { + putAll(map); + if (map instanceof ManagedVersionMap) + { + this.override = override || ((ManagedVersionMap)map).isOverrides(); + + } + else + { + this.override = override; + } + } + else + { + this.override = override; + } + } + + public boolean isOverrides() + { + return this.override; + } + + public String toString() + { + StringBuffer buffer = new StringBuffer("ManagedVersionMap\n"); + Iterator iter = this.keySet().iterator(); + while (iter.hasNext()) + { + String key = (String)iter.next(); + buffer.append(key).append("=").append(get(key)); + if (iter.hasNext()) + { + buffer.append("\n"); + } + } + return buffer.toString(); + } +} Index: maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java =================================================================== --- maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java (revision 442844) +++ maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java (working copy) @@ -25,6 +25,7 @@ import org.apache.maven.artifact.versioning.ArtifactVersion; import org.apache.maven.artifact.versioning.OverConstrainedVersionException; import org.apache.maven.artifact.versioning.VersionRange; +import org.apache.maven.artifact.versioning.ManagedVersionMap; import java.util.ArrayList; import java.util.Collections; @@ -64,7 +65,10 @@ root.addDependencies( artifacts, remoteRepositories, filter ); - recurse( root, resolvedArtifacts, managedVersions, localRepository, remoteRepositories, source, filter, + ManagedVersionMap versionMap = (managedVersions != null && managedVersions instanceof ManagedVersionMap) ? + (ManagedVersionMap)managedVersions : new ManagedVersionMap(managedVersions, false); + + recurse( root, resolvedArtifacts, versionMap, localRepository, remoteRepositories, source, filter, listeners ); Set set = new HashSet(); @@ -99,7 +103,7 @@ return result; } - private void recurse( ResolutionNode node, Map resolvedArtifacts, Map managedVersions, + private void recurse( ResolutionNode node, Map resolvedArtifacts, ManagedVersionMap managedVersions, ArtifactRepository localRepository, List remoteRepositories, ArtifactMetadataSource source, ArtifactFilter filter, List listeners ) throws CyclicDependencyException, ArtifactResolutionException, OverConstrainedVersionException @@ -108,6 +112,7 @@ // TODO: use as a conflict resolver Object key = node.getKey(); + boolean defaultVersion = false; if ( managedVersions.containsKey( key ) ) { Artifact artifact = (Artifact) managedVersions.get( key ); @@ -117,6 +122,7 @@ if ( artifact.getVersion() != null ) { node.getArtifact().setVersion( artifact.getVersion() ); + defaultVersion = true; } if ( artifact.getScope() != null ) { @@ -127,7 +133,8 @@ List previousNodes = (List) resolvedArtifacts.get( key ); if ( previousNodes != null ) { - for ( Iterator i = previousNodes.iterator(); i.hasNext(); ) + boolean useDefault = defaultVersion && managedVersions.isOverrides(); + for ( Iterator i = previousNodes.iterator(); !useDefault && i.hasNext(); ) { ResolutionNode previous = (ResolutionNode) i.next(); Index: maven-model/maven.mdo =================================================================== --- maven-model/maven.mdo (revision 442844) +++ maven-model/maven.mdo (working copy) @@ -586,6 +586,7 @@ dependencyManagement 4.0.0 + false false + override + + When set to true the versions specified here will override the versions specified in + the dependencies themselves. + + boolean + + dependencies 4.0.0 Index: maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java =================================================================== --- maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java (revision 442844) +++ maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java (working copy) @@ -32,6 +32,7 @@ import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.artifact.versioning.VersionRange; +import org.apache.maven.artifact.versioning.ManagedVersionMap; import org.apache.maven.model.Build; import org.apache.maven.model.Dependency; import org.apache.maven.model.DependencyManagement; @@ -266,6 +267,8 @@ MavenProject project = new MavenProject( superModel ); + project.setManagedVersionMap(createManagedVersionMap(projectId, superModel.getDependencyManagement(), null)); + project.setActiveProfiles( activeProfiles ); project.setOriginalModel( superModel ); @@ -326,7 +329,8 @@ String projectId = safeVersionlessKey( project.getGroupId(), project.getArtifactId() ); - Map managedVersions = createManagedVersionMap( projectId, project.getDependencyManagement() ); + // Map managedVersions = createManagedVersionMap( projectId, project.getDependencyManagement() ); + Map managedVersions = project.getManagedVersionMap(); ensureMetadataSourceIsInitialized(); @@ -378,16 +382,28 @@ } } - private Map createManagedVersionMap( String projectId, DependencyManagement dependencyManagement ) + private Map createManagedVersionMap( String projectId, DependencyManagement dependencyManagement, MavenProject parent) throws ProjectBuildingException { - Map map; + Map map = null; + if ( dependencyManagement != null && dependencyManagement.getDependencies() != null ) { - map = new HashMap(); + if (parent != null && dependencyManagement.isOverride()) + { + map = new ManagedVersionMap(parent.getManagedVersionMap(), true); + } + else + { + map = new ManagedVersionMap(dependencyManagement.isOverride()); + } for ( Iterator i = dependencyManagement.getDependencies().iterator(); i.hasNext(); ) { Dependency d = (Dependency) i.next(); + if (map.containsKey(d.getManagementKey())) + { + continue; + } try { @@ -405,6 +421,11 @@ } } } + else if (parent != null && (dependencyManagement = parent.getDependencyManagement()) != null && + dependencyManagement.isOverride()) + { + map = new ManagedVersionMap(parent.getManagedVersionMap(), true); + } else { map = Collections.EMPTY_MAP; @@ -796,6 +817,8 @@ } } + project.setManagedVersionMap(createManagedVersionMap(projectId, superModel.getDependencyManagement(), project.getParent())); + return project; } @@ -935,6 +958,7 @@ ModelValidationResult validationResult = validator.validate( model ); String projectId = safeVersionlessKey( model.getGroupId(), model.getArtifactId() ); + project.setManagedVersionMap(createManagedVersionMap(projectId, model.getDependencyManagement(), parentProject)); if ( validationResult.getMessageCount() > 0 ) { @@ -1025,10 +1049,10 @@ Parent parentModel = model.getParent(); + String projectId = safeVersionlessKey( model.getGroupId(), model.getArtifactId() ); + if ( parentModel != null ) { - String projectId = safeVersionlessKey( model.getGroupId(), model.getArtifactId() ); - if ( StringUtils.isEmpty( parentModel.getGroupId() ) ) { throw new ProjectBuildingException( projectId, "Missing groupId element from parent element" ); @@ -1212,6 +1236,8 @@ project.setParentArtifact( parentArtifact ); } + project.setManagedVersionMap(createManagedVersionMap(projectId, model.getDependencyManagement(), project.getParent())); + return project; } Index: maven-project/src/main/java/org/apache/maven/project/MavenProject.java =================================================================== --- maven-project/src/main/java/org/apache/maven/project/MavenProject.java (revision 442844) +++ maven-project/src/main/java/org/apache/maven/project/MavenProject.java (working copy) @@ -31,6 +31,7 @@ import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.artifact.DependencyResolutionRequiredException; +import org.apache.maven.artifact.versioning.ManagedVersionMap; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.filter.ArtifactFilter; @@ -136,6 +137,8 @@ private Map extensionArtifactMap; + private Map managedVersionMap; + private Map projectReferences = new HashMap(); private Build buildOverlay; @@ -249,7 +252,12 @@ if ( project.artifact != null ) { this.artifact = ArtifactUtils.copyArtifact( project.artifact ); - } + } + + if (project.getManagedVersionMap() != null) + { + setManagedVersionMap(new ManagedVersionMap(project.getManagedVersionMap(), false)); + } } public String getModulePathAdjustment( MavenProject moduleProject ) throws IOException @@ -1478,6 +1486,16 @@ return originalModel; } + public void setManagedVersionMap(Map map) + { + this.managedVersionMap = map; + } + + public Map getManagedVersionMap() + { + return this.managedVersionMap; + } + public boolean equals( Object other ) { if ( other == this )