Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -275,21 +275,20 @@ public ApplicationModel resolveModel(WorkspaceModule module)
.setResolvedPaths(resolvedPaths.build())
.setWorkspaceModule(module);

final Map<ArtifactKey, Dependency> managedMap = new HashMap<>();
final Map<ArtifactKey, Dependency> 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())));
}
}
final List<Dependency> directDeps = new ArrayList<>(module.getDirectDependencies().size());
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");
Expand All @@ -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<Dependency> 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,
Expand All @@ -317,11 +313,11 @@ private ApplicationModel doResolveModel(ArtifactCoords coords,
}
Artifact mvnArtifact = toAetherArtifact(coords);

List<Dependency> managedDeps = List.of();
Map<ArtifactKey, Dependency> managedDeps = null;
List<RemoteRepository> 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());
}

Expand All @@ -330,33 +326,18 @@ private ApplicationModel doResolveModel(ArtifactCoords coords,
mvnArtifact = toAetherArtifact(appArtifact);
final ArtifactDescriptorResult appArtifactDescr = resolveDescriptor(mvnArtifact, aggregatedRepos);

Map<ArtifactKey, String> managedVersions = Map.of();
if (!managedDeps.isEmpty()) {
final List<Dependency> 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<String> getExcludedScopes() {
Expand All @@ -371,7 +352,7 @@ private Set<String> getExcludedScopes() {

private ApplicationModel buildAppModel(ResolvedDependencyBuilder appArtifact,
Artifact artifact, List<Dependency> directDeps, List<RemoteRepository> repos,
Set<ArtifactKey> reloadableModules, List<Dependency> managedDeps)
Set<ArtifactKey> reloadableModules, Map<ArtifactKey, Dependency> managedDeps)
throws AppModelResolverException {

final ApplicationModelBuilder appBuilder = new ApplicationModelBuilder().setAppArtifact(appArtifact);
Expand All @@ -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;
Expand All @@ -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()
Expand All @@ -421,6 +404,7 @@ private ApplicationModel buildAppModel(ResolvedDependencyBuilder appArtifact,
.setDependencyLogging(depLogConfig)
.setRuntimeModelOnly(runtimeModelOnly)
.setDevMode(devmode)
.setManagedDependencies(managedDeps)
.resolve(collectRtDepsRequest);
}
if (logTime) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ private static ModelResolutionTaskRunner getTaskRunner() {
private Collection<ConditionalDependency> conditionalDepsToProcess = new ConcurrentLinkedDeque<>();

private MavenArtifactResolver resolver;
private List<Dependency> managedDeps;
private Map<ArtifactKey, Dependency> managedDeps;
private ApplicationModelBuilder appBuilder;
private boolean collectReloadableModules;
private DependencyLoggingConfig depLogging;
Expand Down Expand Up @@ -182,17 +182,25 @@ public ApplicationDependencyResolver setDevMode(boolean devMode) {
return this;
}

/**
* Managed dependency version constraints.
*
* @param managedDeps managed dependency version constraints
* @return self
*/
public ApplicationDependencyResolver setManagedDependencies(Map<ArtifactKey, Dependency> managedDeps) {
this.managedDeps = managedDeps;
return this;
}

/**
* Resolves application dependencies and adds the to the application model builder.
*
* @param collectRtDepsRequest request to collect runtime dependencies
* @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);
Expand Down Expand Up @@ -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());
}
Expand All @@ -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());
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -845,12 +856,16 @@ private CollectRequest getCollectRequest(Artifact artifact, Collection<Exclusion
} catch (BootstrapMavenException e) {
throw new DeploymentInjectionException("Failed to resolve descriptor for " + artifact, e);
}
final List<Dependency> allConstraints = new ArrayList<>(
managedDeps.size() + descr.getManagedDependencies().size());
allConstraints.addAll(managedDeps);
allConstraints.addAll(descr.getManagedDependencies());
final List<Dependency> effectiveConstraints;
if (descr.getManagedDependencies().isEmpty()) {
effectiveConstraints = new ArrayList<>(managedDeps.values());
} else {
final Map<ArtifactKey, Dependency> 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)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public static Artifact getRuntimeArtifact(DependencyNode dep) {
private final Map<ArtifactCoords, Set<ArtifactKey>> artifactDeps = new HashMap<>();

private MavenArtifactResolver resolver;
private List<Dependency> managedDeps;
private Map<ArtifactKey, Dependency> managedDeps;
private ApplicationModelBuilder appBuilder;
private boolean collectReloadableModules;
private Consumer<String> buildTreeConsumer;
Expand Down Expand Up @@ -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<ArtifactKey, Dependency> managedDeps) {
this.managedDeps = managedDeps;
return this;
}

public void resolve(CollectRequest collectRtDepsRequest) throws AppModelResolverException {

this.managedDeps = collectRtDepsRequest.getManagedDependencies();
DependencyNode root = resolveRuntimeDeps(collectRtDepsRequest);

if (collectReloadableModules) {
Expand All @@ -198,8 +208,6 @@ public void resolve(CollectRequest collectRtDepsRequest) throws AppModelResolver
e);
}

this.managedDeps = managedDeps.isEmpty() ? new ArrayList<>() : managedDeps;

visitRuntimeDependencies(root.getChildren());
enableConditionalDeps();

Expand Down Expand Up @@ -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());
}
Expand All @@ -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());
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -662,26 +673,23 @@ private DependencyNode collectDependencies(Artifact artifact, Collection<Exclusi
} catch (BootstrapMavenException e) {
throw new DeploymentInjectionException("Failed to resolve descriptor for " + artifact, e);
}
final List<Dependency> mergedManagedDeps = new ArrayList<>(
managedDeps.size() + descr.getManagedDependencies().size());
final Map<ArtifactKey, String> 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<ArtifactKey, Dependency> effectiveManagedMap;
final List<Dependency> 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);
Expand Down
Loading
Loading