From fbd79dd4976f41898a9f0b108c38d55699072cd2 Mon Sep 17 00:00:00 2001 From: Peter Palaga Date: Tue, 7 Oct 2025 00:07:31 +0200 Subject: [PATCH 1/2] Domino looses dependency links for artifacts managed at a custom version, fix #399 --- .../domino/ProjectDependencyResolver.java | 29 +++++++++++++++++-- .../BasicBomBasedProjectDependencyTest.java | 13 ++++----- ...NonCorePlatformMemberDependenciesTest.java | 19 ++++++++---- 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/domino/api/src/main/java/io/quarkus/domino/ProjectDependencyResolver.java b/domino/api/src/main/java/io/quarkus/domino/ProjectDependencyResolver.java index 528a6fb3..10e7bde0 100644 --- a/domino/api/src/main/java/io/quarkus/domino/ProjectDependencyResolver.java +++ b/domino/api/src/main/java/io/quarkus/domino/ProjectDependencyResolver.java @@ -20,6 +20,7 @@ import io.quarkus.domino.scm.ScmRevisionResolver; import io.quarkus.maven.dependency.ArtifactCoords; import io.quarkus.maven.dependency.ArtifactKey; +import io.quarkus.maven.dependency.GACT; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; @@ -286,6 +287,7 @@ public static Builder builder() { private Function> artifactConstraintsProvider; private Set allConstraints; + private Map allConstraintsByGa; private Set projectBomConstraints; private final Map allDepsToBuild = new HashMap<>(); private final Set nonManagedVisited = new HashSet<>(); @@ -625,7 +627,7 @@ private static Set toArtifactCoords(Collection deps) for (var d : deps) { result.add(toCoords(d.getArtifact())); } - return result; + return Collections.unmodifiableSet(result); } public void resolveDependencies() { @@ -643,6 +645,17 @@ void resolveDependenciesInternal() { enforcedConstraints.addAll(getBomConstraints(bomCoords)); } allConstraints = toArtifactCoords(enforcedConstraints); + allConstraintsByGa = Collections.unmodifiableMap( + allConstraints.stream() + .collect( + HashMap::new, + (m, gav) -> m.put(new GACT( + gav.getGroupId(), + gav.getArtifactId(), + gav.getClassifier(), + gav.getType()), + gav), + (m1, m2) -> m1.putAll(m2))); if (artifactConstraintsProvider == null) { artifactConstraintsProvider = t -> enforcedConstraints; } @@ -997,8 +1010,7 @@ private void configureReleaseRepoDeps() { } for (Dependency directDep : descriptor.getDependencies()) { final Artifact a = directDep.getArtifact(); - final ArtifactDependency dirArt = artifactDeps.get(ArtifactCoords.of(a.getGroupId(), a.getArtifactId(), - a.getClassifier(), a.getExtension(), a.getVersion())); + final ArtifactDependency dirArt = artifactDeps.get(toManagedCoords(a)); if (dirArt != null) { d.addDependency(dirArt); } @@ -1014,6 +1026,16 @@ private void configureReleaseRepoDeps() { } } + private ArtifactCoords toManagedCoords(Artifact a) { + final ArtifactCoords managed = allConstraintsByGa.get(new GACT(a.getGroupId(), a.getArtifactId(), + a.getClassifier(), a.getExtension())); + if (managed != null) { + return managed; + } + return ArtifactCoords.of(a.getGroupId(), a.getArtifactId(), + a.getClassifier(), a.getExtension(), a.getVersion()); + } + private ScmRevision getRevision(ArtifactCoords coords, List repos) { final ScmRevision revision; if (this.preResolvedRootArtifacts.containsKey(coords)) { @@ -1712,4 +1734,5 @@ private static GAV toGav(ArtifactCoords coords) { private static ArtifactCoords toCoords(Artifact a) { return ArtifactCoords.of(a.getGroupId(), a.getArtifactId(), a.getClassifier(), a.getExtension(), a.getVersion()); } + } diff --git a/domino/api/src/test/java/io/quarkus/domino/BasicBomBasedProjectDependencyTest.java b/domino/api/src/test/java/io/quarkus/domino/BasicBomBasedProjectDependencyTest.java index 6a5c4e43..368c99cb 100644 --- a/domino/api/src/test/java/io/quarkus/domino/BasicBomBasedProjectDependencyTest.java +++ b/domino/api/src/test/java/io/quarkus/domino/BasicBomBasedProjectDependencyTest.java @@ -99,7 +99,7 @@ public void completeTree() { assertThat(rc.getReleases()).hasSize(4); var roots = toMap(rc.getRootReleaseRepos()); - assertThat(roots).hasSize(2); + assertThat(roots).hasSize(1); var release = roots.get(ReleaseIdFactory.forScmAndTag("https://acme.org/lib", "1.0")); assertThat(release).isNotNull(); @@ -115,10 +115,9 @@ public void completeTree() { assertThat(release.getArtifacts()).hasSize(2); assertThat(release.getArtifacts()).containsKey(ArtifactCoords.pom("org.bar", "bar-parent", "1.0")); assertThat(release.getArtifacts()).containsKey(ArtifactCoords.jar("org.bar", "bar-lib", "1.0")); - assertThat(release.getDependencies()).isEmpty(); + assertThat(release.getDependencies()).hasSize(1); - release = roots.get(ReleaseIdFactory.forScmAndTag("https://foo.org/lib", "2.0")); - assertThat(release).isNotNull(); + release = release.getDependencies().iterator().next(); assertThat(release.getArtifacts()).hasSize(1); assertThat(release.getArtifacts()).containsKey(ArtifactCoords.jar("org.foo", "foo-lib", "2.0")); assertThat(release.getDependencies()).hasSize(1); @@ -147,7 +146,7 @@ public void onlyManaged() { assertThat(rc.getReleases()).hasSize(3); var roots = toMap(rc.getRootReleaseRepos()); - assertThat(roots).hasSize(2); + assertThat(roots).hasSize(1); var release = roots.get(ReleaseIdFactory.forScmAndTag("https://acme.org/lib", "1.0")); assertThat(release).isNotNull(); assertThat(release.getArtifacts()).hasSize(4); @@ -162,9 +161,9 @@ public void onlyManaged() { assertThat(release.getArtifacts()).hasSize(2); assertThat(release.getArtifacts()).containsKey(ArtifactCoords.pom("org.bar", "bar-parent", "1.0")); assertThat(release.getArtifacts()).containsKey(ArtifactCoords.jar("org.bar", "bar-lib", "1.0")); - assertThat(release.getDependencies()).isEmpty(); + assertThat(release.getDependencies()).hasSize(1); - release = roots.get(ReleaseIdFactory.forScmAndTag("https://foo.org/lib", "2.0")); + release = release.getDependencies().iterator().next(); assertThat(release).isNotNull(); assertThat(release.getArtifacts()).hasSize(1); assertThat(release.getArtifacts()).containsKey(ArtifactCoords.jar("org.foo", "foo-lib", "2.0")); diff --git a/domino/api/src/test/java/io/quarkus/domino/NonCorePlatformMemberDependenciesTest.java b/domino/api/src/test/java/io/quarkus/domino/NonCorePlatformMemberDependenciesTest.java index 415df34f..762d6b81 100644 --- a/domino/api/src/test/java/io/quarkus/domino/NonCorePlatformMemberDependenciesTest.java +++ b/domino/api/src/test/java/io/quarkus/domino/NonCorePlatformMemberDependenciesTest.java @@ -37,10 +37,16 @@ static void prepareRepo() { .setTag("1.0"); var byteUtilsLib = byteUtilsProject.createMainModule("byte-utils"); - var commonsIoProject = TestProject.of("org.commons.io", "1.0") + var commonsIoProject10 = TestProject.of("org.commons.io", "1.0") .setRepoUrl("https://commons.org/code/io") .setTag("1.0"); - var commonsIoLib = commonsIoProject.createMainModule("commons-io") + var commonsIoLib10 = commonsIoProject10.createMainModule("commons-io") + .addDependency(byteUtilsLib); + + var commonsIoProject09 = TestProject.of("org.commons.io", "0.9") + .setRepoUrl("https://commons.org/code/io") + .setTag("0.9"); + var commonsIoLib09 = commonsIoProject09.createMainModule("commons-io") .addDependency(byteUtilsLib); var quarkusProject = TestProject.of("io.quarkus", "1.0") @@ -52,7 +58,7 @@ static void prepareRepo() { var quarkusBuildParent = quarkusParent.addPomModule("quarkus-build-parent") .importBom(quarkusBom); var quarkusCore = quarkusBuildParent.addModule("quarkus-core") - .addDependency(commonsIoLib); + .addDependency(commonsIoLib09); var filesLibProject = TestProject.of("org.files", "1.0") .setRepoUrl("https://files.org/code") @@ -73,7 +79,7 @@ static void prepareRepo() { .addVersionConstraint("camel-core") .addVersionConstraint("camel-xml-lib") .addVersionConstraint(xmlLib) - .addVersionConstraint(commonsIoLib); + .addVersionConstraint(commonsIoLib10); var camelBuildParent = camelParent.addPomModule("camel-build-parent") .importBom(camelBom); var camelCore = camelBuildParent.addModule("camel-core") @@ -86,7 +92,8 @@ static void prepareRepo() { .install(camelProject) .install(filesLibProject) .install(xmlLibProject) - .install(commonsIoProject) + .install(commonsIoProject10) + .install(commonsIoProject09) .install(byteUtilsProject); releaseAssertions = Map.> of( @@ -101,6 +108,8 @@ static void prepareRepo() { .containsKey(ArtifactCoords.pom("io.quarkus", "quarkus-build-parent", "1.0")); assertThat(release.getArtifacts()).containsKey(ArtifactCoords.jar("io.quarkus", "quarkus-core", "1.0")); assertThat(release.getDependencies()).hasSize(1); + assertThat(release.getDependencies().iterator().next().artifacts) + .containsKey(ArtifactCoords.jar("org.commons.io", "commons-io", "1.0")); }, ReleaseIdFactory.forScmAndTag("https://camel.org/code", "1.0"), release -> { From 1e860413e29e519b8eb7a7536e853786418f7622 Mon Sep 17 00:00:00 2001 From: Peter Palaga Date: Tue, 7 Oct 2025 00:12:59 +0200 Subject: [PATCH 2/2] logInternal() should not call resolveDependenciesInternal() --- .../main/java/io/quarkus/domino/ProjectDependencyResolver.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/domino/api/src/main/java/io/quarkus/domino/ProjectDependencyResolver.java b/domino/api/src/main/java/io/quarkus/domino/ProjectDependencyResolver.java index 10e7bde0..c35e872a 100644 --- a/domino/api/src/main/java/io/quarkus/domino/ProjectDependencyResolver.java +++ b/domino/api/src/main/java/io/quarkus/domino/ProjectDependencyResolver.java @@ -384,6 +384,7 @@ public T applyToSorted(Function, T> func) { public void log() { try { + resolveDependenciesInternal(); logInternal(); } finally { close(); @@ -391,8 +392,6 @@ public void log() { } void logInternal() { - - resolveDependenciesInternal(); int codeReposTotal = 0; int reportedArtifactsTotal = 0; if ((config.isLogArtifactsToBuild()