Commits
Tarun Sukhani authored 609fd4011c3
fix: coalesce same-module classifier dependencies in YamlParser (PF-74, release 1.12.27) dependencies.yml declares 5 classifier rows for io.netty -> netty-codec-native-quic 4.2.12.Final (one per supported HTTP/3 platform). YamlParser.parseDescriptor was creating a separate DefaultDependencyDescriptor per row, each with the same ModuleRevisionId (io.netty#netty-codec-native-quic;4.2.12.Final) but a different classifier extra-attribute. Ivy's conflict manager treats these as 5 versions of the same module and evicts 4. ant resolve -Dprune=true then deletes the 4 evicted jars from framework/lib/, breaking HTTP/3 on every platform except the non-deterministic survivor (osx-x86_64 in observed runs). Refactor: classifier is now an artifact-level attribute, not a module-revision identity. ModuleRevisionId is built without the classifier; a per-parse Map<ModuleRevisionId, DefaultDependencyDescriptor> coalesces same-org#module;rev rows into one DefaultDependencyDescriptor with multiple DefaultDependencyArtifactDescriptors (each carrying its own m:classifier extra). First row's dep-level options (force/transitive/changing/exclude/confs) control; subsequent rows with non-empty options trigger a Logger.warn. Per-row id filter still evaluated independently — filtered rows skip both descriptor creation and artifact attachment. Verified end-to-end: ant resolve -Dprune=true now resolves 99 artifacts (was 95), 0 evicted (was 4), 0 pruned. Reproduction test: delete one classifier jar, run resolve, jar is restored. ant unittest + ant jar both green. dependencies.yml syntax unchanged; existing single-row and brotli4j-style separate-artifactId deps unaffected. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>