diff --git a/independent-projects/bootstrap/core/src/test/java/io/quarkus/bootstrap/resolver/replace/test/ManagedReplacedDependencyTestCase.java b/independent-projects/bootstrap/core/src/test/java/io/quarkus/bootstrap/resolver/replace/test/ManagedReplacedDependencyTestCase.java index a12eab1099937..d0114618cbb1f 100644 --- a/independent-projects/bootstrap/core/src/test/java/io/quarkus/bootstrap/resolver/replace/test/ManagedReplacedDependencyTestCase.java +++ b/independent-projects/bootstrap/core/src/test/java/io/quarkus/bootstrap/resolver/replace/test/ManagedReplacedDependencyTestCase.java @@ -45,7 +45,7 @@ protected void setupDependencies() throws Exception { install(ext301, false); // add a dependency on ext3 (no version) - root.addDependency(TsArtifact.jar(ext300.getRuntime().getArtifactId(), null)); + root.addDependency(TsArtifact.jar("ext3", null)); // the dependency management addManagedDep(ext103); diff --git a/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/BootstrapAppModelResolver.java b/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/BootstrapAppModelResolver.java index 75caecdcf3ef2..eb6697fe73760 100644 --- a/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/BootstrapAppModelResolver.java +++ b/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/BootstrapAppModelResolver.java @@ -275,13 +275,12 @@ public ApplicationModel resolveModel(WorkspaceModule module) .setResolvedPaths(resolvedPaths.build()) .setWorkspaceModule(module); - final Map managedMap = new HashMap<>(); + final Map managedDeps = new HashMap<>(); for (io.quarkus.maven.dependency.Dependency d : module.getDirectDependencyConstraints()) { if (io.quarkus.maven.dependency.Dependency.SCOPE_IMPORT.equals(d.getScope())) { - mvn.resolveDescriptor(toAetherArtifact(d)).getManagedDependencies() - .forEach(dep -> managedMap.putIfAbsent(getKey(dep.getArtifact()), dep)); + DependencyUtils.putAll(managedDeps, mvn.resolveDescriptor(toAetherArtifact(d)).getManagedDependencies()); } else { - managedMap.put(d.getKey(), new Dependency(toAetherArtifact(d), d.getScope(), d.isOptional(), + managedDeps.put(d.getKey(), new Dependency(toAetherArtifact(d), d.getScope(), d.isOptional(), toAetherExclusions(d.getExclusions()))); } } @@ -289,7 +288,7 @@ public ApplicationModel resolveModel(WorkspaceModule module) for (io.quarkus.maven.dependency.Dependency d : module.getDirectDependencies()) { String version = d.getVersion(); if (version == null) { - final Dependency constraint = managedMap.get(d.getKey()); + final Dependency constraint = managedDeps.get(d.getKey()); if (constraint == null) { throw new AppModelResolverException( d.toCompactCoords() + " is missing version and is not found among the dependency constraints"); @@ -300,11 +299,8 @@ public ApplicationModel resolveModel(WorkspaceModule module) new DefaultArtifact(d.getGroupId(), d.getArtifactId(), d.getClassifier(), d.getType(), version), d.getScope(), d.isOptional(), toAetherExclusions(d.getExclusions()))); } - final List constraints = managedMap.isEmpty() ? List.of() : new ArrayList<>(managedMap.values()); - return buildAppModel(mainDep, - mainArtifact, directDeps, mvn.getRepositories(), - Set.of(), constraints); + return buildAppModel(mainDep, mainArtifact, directDeps, mvn.getRepositories(), Set.of(), managedDeps); } private ApplicationModel doResolveModel(ArtifactCoords coords, @@ -317,11 +313,11 @@ private ApplicationModel doResolveModel(ArtifactCoords coords, } Artifact mvnArtifact = toAetherArtifact(coords); - List managedDeps = List.of(); + Map managedDeps = null; List managedRepos = List.of(); if (managingProject != null) { final ArtifactDescriptorResult managingDescr = mvn.resolveDescriptor(toAetherArtifact(managingProject)); - managedDeps = managingDescr.getManagedDependencies(); + managedDeps = DependencyUtils.toMap(managingDescr.getManagedDependencies()); managedRepos = mvn.newResolutionRepositories(managingDescr.getRepositories()); } @@ -330,33 +326,18 @@ private ApplicationModel doResolveModel(ArtifactCoords coords, mvnArtifact = toAetherArtifact(appArtifact); final ArtifactDescriptorResult appArtifactDescr = resolveDescriptor(mvnArtifact, aggregatedRepos); - Map managedVersions = Map.of(); - if (!managedDeps.isEmpty()) { - final List mergedManagedDeps = new ArrayList<>( - managedDeps.size() + appArtifactDescr.getManagedDependencies().size()); - managedVersions = new HashMap<>(managedDeps.size()); - for (Dependency dep : managedDeps) { - managedVersions.put(getKey(dep.getArtifact()), dep.getArtifact().getVersion()); - mergedManagedDeps.add(dep); - } - for (Dependency dep : appArtifactDescr.getManagedDependencies()) { - final ArtifactKey key = getKey(dep.getArtifact()); - if (!managedVersions.containsKey(key)) { - mergedManagedDeps.add(dep); - } - } - managedDeps = mergedManagedDeps; + if (managedDeps != null && !managedDeps.isEmpty()) { + DependencyUtils.putAll(managedDeps, appArtifactDescr.getManagedDependencies()); } else { - managedDeps = appArtifactDescr.getManagedDependencies(); + managedDeps = DependencyUtils.toMap(appArtifactDescr.getManagedDependencies()); } - directMvnDeps = DependencyUtils.mergeDeps(directMvnDeps, appArtifactDescr.getDependencies(), managedVersions, Set.of()); + directMvnDeps = DependencyUtils.mergeDependencies(directMvnDeps, appArtifactDescr.getDependencies(), managedDeps, + Set.of()); aggregatedRepos = mvn.aggregateRepositories(aggregatedRepos, mvn.newResolutionRepositories(appArtifactDescr.getRepositories())); - return buildAppModel(appArtifact, - mvnArtifact, directMvnDeps, aggregatedRepos, - reloadableModules, managedDeps); + return buildAppModel(appArtifact, mvnArtifact, directMvnDeps, aggregatedRepos, reloadableModules, managedDeps); } private Set getExcludedScopes() { @@ -371,7 +352,7 @@ private Set getExcludedScopes() { private ApplicationModel buildAppModel(ResolvedDependencyBuilder appArtifact, Artifact artifact, List directDeps, List repos, - Set reloadableModules, List managedDeps) + Set reloadableModules, Map managedDeps) throws AppModelResolverException { final ApplicationModelBuilder appBuilder = new ApplicationModelBuilder().setAppArtifact(appArtifact); @@ -395,7 +376,8 @@ private ApplicationModel buildAppModel(ResolvedDependencyBuilder appArtifact, } directDeps = filtered; } - var collectRtDepsRequest = MavenArtifactResolver.newCollectRequest(artifact, directDeps, managedDeps, List.of(), repos); + var collectRtDepsRequest = MavenArtifactResolver.newCollectRequest(artifact, directDeps, + new ArrayList<>(managedDeps.values()), List.of(), repos); try { long start = 0; boolean logTime = false; @@ -411,6 +393,7 @@ private ApplicationModel buildAppModel(ResolvedDependencyBuilder appArtifact, .setBuildTreeConsumer(depLogConfig == null ? null : depLogConfig.getMessageConsumer()) .setRuntimeModelOnly(runtimeModelOnly) .setDevMode(devmode) + .setManagedDependencies(managedDeps) .resolve(collectRtDepsRequest); } else { ApplicationDependencyResolver.newInstance() @@ -421,6 +404,7 @@ private ApplicationModel buildAppModel(ResolvedDependencyBuilder appArtifact, .setDependencyLogging(depLogConfig) .setRuntimeModelOnly(runtimeModelOnly) .setDevMode(devmode) + .setManagedDependencies(managedDeps) .resolve(collectRtDepsRequest); } if (logTime) { diff --git a/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/ApplicationDependencyResolver.java b/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/ApplicationDependencyResolver.java index cdb66842d2fbb..791f54e5bcb1e 100644 --- a/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/ApplicationDependencyResolver.java +++ b/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/ApplicationDependencyResolver.java @@ -96,7 +96,7 @@ private static ModelResolutionTaskRunner getTaskRunner() { private Collection conditionalDepsToProcess = new ConcurrentLinkedDeque<>(); private MavenArtifactResolver resolver; - private List managedDeps; + private Map managedDeps; private ApplicationModelBuilder appBuilder; private boolean collectReloadableModules; private DependencyLoggingConfig depLogging; @@ -182,6 +182,17 @@ public ApplicationDependencyResolver setDevMode(boolean devMode) { return this; } + /** + * Managed dependency version constraints. + * + * @param managedDeps managed dependency version constraints + * @return self + */ + public ApplicationDependencyResolver setManagedDependencies(Map managedDeps) { + this.managedDeps = managedDeps; + return this; + } + /** * Resolves application dependencies and adds the to the application model builder. * @@ -189,10 +200,7 @@ public ApplicationDependencyResolver setDevMode(boolean devMode) { * @throws AppModelResolverException in case of a failure */ public void resolve(CollectRequest collectRtDepsRequest) throws AppModelResolverException { - this.managedDeps = collectRtDepsRequest.getManagedDependencies(); - // managed dependencies will be a bit augmented with every added extension, so let's load the properties early collectPlatformProperties(); - this.managedDeps = managedDeps.isEmpty() ? new ArrayList<>() : managedDeps; DependencyNode root = resolveRuntimeDeps(collectRtDepsRequest); processRuntimeDeps(root); @@ -325,7 +333,7 @@ private void collectCompileOnly(CollectRequest collectRtDepsRequest, DependencyN var children = root.getChildren(); while (children != null) { for (DependencyNode node : children) { - managedDeps.add(node.getDependency()); + managedDeps.putIfAbsent(DependencyUtils.getKey(node.getArtifact()), node.getDependency()); if (!node.getChildren().isEmpty()) { depStack.add(node.getChildren()); } @@ -334,7 +342,7 @@ private void collectCompileOnly(CollectRequest collectRtDepsRequest, DependencyN } final CollectRequest request = new CollectRequest() .setDependencies(collectCompileOnly) - .setManagedDependencies(managedDeps) + .setManagedDependencies(new ArrayList<>(managedDeps.values())) .setRepositories(collectRtDepsRequest.getRepositories()); if (collectRtDepsRequest.getRoot() != null) { request.setRoot(collectRtDepsRequest.getRoot()); @@ -386,7 +394,7 @@ private void collectCompileOnly(CollectRequest collectRtDepsRequest, DependencyN */ private void collectPlatformProperties() throws AppModelResolverException { final PlatformImportsImpl platformReleases = new PlatformImportsImpl(); - for (Dependency d : managedDeps) { + for (Dependency d : managedDeps.values()) { final Artifact artifact = d.getArtifact(); final String extension = artifact.getExtension(); if ("json".equals(extension) @@ -631,7 +639,10 @@ void setFlags(byte walkingFlags) { if (existingDep == null) { appBuilder.addDependency(resolvedDep); if (ext != null) { - managedDeps.add(new Dependency(ext.info.deploymentArtifact, JavaScopes.COMPILE)); + final ArtifactKey deploymentKey = getKey(ext.info.deploymentArtifact); + if (!managedDeps.containsKey(deploymentKey)) { + managedDeps.put(deploymentKey, new Dependency(ext.info.deploymentArtifact, JavaScopes.COMPILE)); + } } } else if (existingDep != resolvedDep) { throw new IllegalStateException(node.getArtifact() + " is already present in the application model"); @@ -845,12 +856,16 @@ private CollectRequest getCollectRequest(Artifact artifact, Collection allConstraints = new ArrayList<>( - managedDeps.size() + descr.getManagedDependencies().size()); - allConstraints.addAll(managedDeps); - allConstraints.addAll(descr.getManagedDependencies()); + final List effectiveConstraints; + if (descr.getManagedDependencies().isEmpty()) { + effectiveConstraints = new ArrayList<>(managedDeps.values()); + } else { + final Map effecctiveMap = new HashMap<>(managedDeps); + DependencyUtils.putAll(effecctiveMap, descr.getManagedDependencies()); + effectiveConstraints = new ArrayList<>(effecctiveMap.values()); + } return new CollectRequest() - .setManagedDependencies(allConstraints) + .setManagedDependencies(effectiveConstraints) .setRepositories(repos) .setRootArtifact(artifact) .setDependencies(List.of(new Dependency(artifact, JavaScopes.COMPILE, false, exclusions))); diff --git a/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/ApplicationDependencyTreeResolver.java b/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/ApplicationDependencyTreeResolver.java index 457e52c3ee111..85b4d45fcb0a1 100644 --- a/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/ApplicationDependencyTreeResolver.java +++ b/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/ApplicationDependencyTreeResolver.java @@ -108,7 +108,7 @@ public static Artifact getRuntimeArtifact(DependencyNode dep) { private final Map> artifactDeps = new HashMap<>(); private MavenArtifactResolver resolver; - private List managedDeps; + private Map managedDeps; private ApplicationModelBuilder appBuilder; private boolean collectReloadableModules; private Consumer buildTreeConsumer; @@ -170,9 +170,19 @@ public ApplicationDependencyTreeResolver setDevMode(boolean devMode) { return this; } + /** + * Managed dependency version constraints. + * + * @param managedDeps managed dependency version constraints + * @return self + */ + public ApplicationDependencyTreeResolver setManagedDependencies(Map managedDeps) { + this.managedDeps = managedDeps; + return this; + } + public void resolve(CollectRequest collectRtDepsRequest) throws AppModelResolverException { - this.managedDeps = collectRtDepsRequest.getManagedDependencies(); DependencyNode root = resolveRuntimeDeps(collectRtDepsRequest); if (collectReloadableModules) { @@ -198,8 +208,6 @@ public void resolve(CollectRequest collectRtDepsRequest) throws AppModelResolver e); } - this.managedDeps = managedDeps.isEmpty() ? new ArrayList<>() : managedDeps; - visitRuntimeDependencies(root.getChildren()); enableConditionalDeps(); @@ -278,7 +286,7 @@ private void collectCompileOnly(CollectRequest collectRtDepsRequest, DependencyN var children = root.getChildren(); while (children != null) { for (DependencyNode node : children) { - managedDeps.add(node.getDependency()); + managedDeps.putIfAbsent(DependencyUtils.getKey(node.getArtifact()), node.getDependency()); if (!node.getChildren().isEmpty()) { depStack.add(node.getChildren()); } @@ -287,7 +295,7 @@ private void collectCompileOnly(CollectRequest collectRtDepsRequest, DependencyN } final CollectRequest request = new CollectRequest() .setDependencies(collectCompileOnly) - .setManagedDependencies(managedDeps) + .setManagedDependencies(new ArrayList<>(managedDeps.values())) .setRepositories(collectRtDepsRequest.getRepositories()); if (collectRtDepsRequest.getRoot() != null) { request.setRoot(collectRtDepsRequest.getRoot()); @@ -330,7 +338,7 @@ private void collectCompileOnly(CollectRequest collectRtDepsRequest, DependencyN private void collectPlatformProperties() throws AppModelResolverException { final PlatformImportsImpl platformReleases = new PlatformImportsImpl(); - for (Dependency d : managedDeps) { + for (Dependency d : managedDeps.values()) { final Artifact artifact = d.getArtifact(); final String extension = artifact.getExtension(); final String artifactId = artifact.getArtifactId(); @@ -473,7 +481,10 @@ private void visitRuntimeDependency(DependencyNode node) { if (isWalkingFlagOn(COLLECT_TOP_EXTENSION_RUNTIME_NODES)) { dep.setFlags(DependencyFlags.TOP_LEVEL_RUNTIME_EXTENSION_ARTIFACT); } - managedDeps.add(new Dependency(extDep.info.deploymentArtifact, JavaScopes.COMPILE)); + final ArtifactKey deploymentKey = DependencyUtils.getKey(extDep.info.deploymentArtifact); + if (!managedDeps.containsKey(deploymentKey)) { + managedDeps.put(deploymentKey, new Dependency(extDep.info.deploymentArtifact, JavaScopes.COMPILE)); + } collectConditionalDependencies(extDep); } if (isWalkingFlagOn(COLLECT_RELOADABLE_MODULES)) { @@ -662,26 +673,23 @@ private DependencyNode collectDependencies(Artifact artifact, Collection mergedManagedDeps = new ArrayList<>( - managedDeps.size() + descr.getManagedDependencies().size()); - final Map managedVersions = new HashMap<>(managedDeps.size()); - for (Dependency dep : managedDeps) { - managedVersions.put(DependencyUtils.getKey(dep.getArtifact()), dep.getArtifact().getVersion()); - mergedManagedDeps.add(dep); - } - for (Dependency dep : descr.getManagedDependencies()) { - final ArtifactKey key = DependencyUtils.getKey(dep.getArtifact()); - if (!managedVersions.containsKey(key)) { - mergedManagedDeps.add(dep); - } + final Map effectiveManagedMap; + final List effectiveManagedDeps; + if (descr.getManagedDependencies().isEmpty()) { + effectiveManagedMap = managedDeps; + effectiveManagedDeps = new ArrayList<>(managedDeps.values()); + } else { + effectiveManagedMap = new HashMap<>(managedDeps); + DependencyUtils.putAll(effectiveManagedMap, descr.getManagedDependencies()); + effectiveManagedDeps = new ArrayList<>(effectiveManagedMap.values()); } - var directDeps = DependencyUtils.mergeDeps(List.of(), descr.getDependencies(), managedVersions, + var directDeps = DependencyUtils.mergeDependencies(List.of(), descr.getDependencies(), effectiveManagedMap, Set.of(JavaScopes.PROVIDED, JavaScopes.TEST)); request = new CollectRequest() .setDependencies(directDeps) - .setManagedDependencies(mergedManagedDeps) + .setManagedDependencies(effectiveManagedDeps) .setRepositories(repos); if (exclusions.isEmpty()) { request.setRootArtifact(artifact); diff --git a/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/MavenArtifactResolver.java b/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/MavenArtifactResolver.java index ee8a85d4091b8..b84b4710ec8e5 100644 --- a/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/MavenArtifactResolver.java +++ b/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/MavenArtifactResolver.java @@ -7,7 +7,6 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -317,25 +316,17 @@ public CollectRequest newCollectManagedRequest(Artifact artifact, List aggregatedRepos = aggregateRepositories(mainRepos, remoteRepos); final ArtifactDescriptorResult descr = resolveDescriptorInternal(artifact, aggregatedRepos); final List mergedManagedDeps; - Map managedVersions = Map.of(); + Map managedMap; if (!managedDeps.isEmpty()) { - mergedManagedDeps = new ArrayList(managedDeps.size() + descr.getManagedDependencies().size()); - managedVersions = new HashMap<>(managedDeps.size()); - for (Dependency dep : managedDeps) { - managedVersions.put(getKey(dep.getArtifact()), dep.getArtifact().getVersion()); - mergedManagedDeps.add(dep); - } - for (Dependency dep : descr.getManagedDependencies()) { - final ArtifactKey key = getKey(dep.getArtifact()); - if (!managedVersions.containsKey(key)) { - mergedManagedDeps.add(dep); - } - } + managedMap = DependencyUtils.toMap(managedDeps); + DependencyUtils.putAll(managedMap, descr.getManagedDependencies()); + mergedManagedDeps = new ArrayList<>(managedMap.values()); } else { mergedManagedDeps = descr.getManagedDependencies(); + managedMap = DependencyUtils.toMap(mergedManagedDeps); } - directDeps = DependencyUtils.mergeDeps(directDeps, descr.getDependencies(), managedVersions, excludedScopes); + directDeps = DependencyUtils.mergeDependencies(directDeps, descr.getDependencies(), managedMap, excludedScopes); aggregatedRepos = aggregateRepositories(aggregatedRepos, newResolutionRepositories(descr.getRepositories())); return newCollectRequest(artifact, directDeps, mergedManagedDeps, exclusions, aggregatedRepos); } diff --git a/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/util/DependencyUtils.java b/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/util/DependencyUtils.java index cc5f42ddec40a..d03bf2d8e59db 100644 --- a/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/util/DependencyUtils.java +++ b/independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/util/DependencyUtils.java @@ -1,7 +1,7 @@ package io.quarkus.bootstrap.util; import java.util.ArrayList; -import java.util.HashSet; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -34,34 +34,51 @@ public static ArtifactCoords getCoords(Artifact artifact) { artifact.getClassifier(), artifact.getExtension(), artifact.getVersion()); } - public static List mergeDeps(List dominant, List recessive, - Map managedVersions, Set excludedScopes) { - final int initialCapacity = dominant.size() + recessive.size(); - if (initialCapacity == 0) { + public static Map toMap(List deps) { + final Map map = new HashMap<>(deps.size()); + for (int i = 0; i < deps.size(); i++) { + final Dependency dep = deps.get(i); + map.put(getKey(dep.getArtifact()), dep); + } + return map; + } + + public static void putAll(Map map, List deps) { + for (int i = 0; i < deps.size(); i++) { + final Dependency dep = deps.get(i); + map.putIfAbsent(getKey(dep.getArtifact()), dep); + } + } + + public static List mergeDependencies(List dominant, List recessive, + Map managedVersions, Set excludedScopes) { + if (dominant.isEmpty() && recessive.isEmpty()) { return List.of(); } - final List result = new ArrayList<>(initialCapacity); - final Set ids = new HashSet<>(initialCapacity, 1.0f); - for (Dependency dependency : dominant) { - if (excludedScopes.contains(dependency.getScope())) { - continue; + final List result = new ArrayList<>(dominant.size() + recessive.size()); + final Map dominantMap = new HashMap<>(dominant.size()); + for (Dependency dep : dominant) { + if (!excludedScopes.contains(dep.getScope())) { + result.add(dep); + final ArtifactKey key = getKey(dep.getArtifact()); + if (!managedVersions.containsKey(key)) { + dominantMap.put(key, dep); + } } - ids.add(getKey(dependency.getArtifact())); - result.add(dependency); } - for (Dependency dependency : recessive) { - if (excludedScopes.contains(dependency.getScope())) { - continue; - } - final ArtifactKey id = getKey(dependency.getArtifact()); - if (ids.contains(id)) { - continue; - } - final String managedVersion = managedVersions.get(id); - if (managedVersion != null) { - dependency = dependency.setArtifact(dependency.getArtifact().setVersion(managedVersion)); + for (Dependency dep : recessive) { + if (!excludedScopes.contains(dep.getScope())) { + final ArtifactKey key = getKey(dep.getArtifact()); + if (!dominantMap.containsKey(key)) { + if (dep.getArtifact().getVersion() == null) { + final Dependency managed = managedVersions.get(key); + if (managed != null) { + dep = dep.setArtifact(dep.getArtifact().setVersion(managed.getArtifact().getVersion())); + } + } + result.add(dep); + } } - result.add(dependency); } return result; }