@@ -24,6 +24,8 @@ import org.eclipse.aether.artifact.Artifact
2424import org.eclipse.aether.artifact.DefaultArtifact
2525import org.eclipse.aether.collection.CollectRequest
2626import org.eclipse.aether.graph.Dependency
27+ import org.eclipse.aether.graph.DependencyFilter
28+ import org.eclipse.aether.graph.DependencyNode
2729import org.eclipse.aether.repository.LocalRepository
2830import org.eclipse.aether.repository.RemoteRepository
2931import org.eclipse.aether.repository.RepositoryPolicy
@@ -431,6 +433,10 @@ public class MavenAetherResolver internal constructor (
431433 }
432434 }
433435
436+ private fun registerGlobalExclusions (packages : Iterable <MavenPackage >) {
437+ globalExclusions.addAll(packages)
438+ }
439+
434440 private fun registerPackages (
435441 name : String ,
436442 manifest : ElidePackageManifest ,
@@ -490,16 +496,16 @@ public class MavenAetherResolver internal constructor (
490496 val repos = state.manifest.dependencies.maven.repositories
491497 val exclusions = state.manifest.dependencies.maven.exclusions
492498
493- if (exclusions.isNotEmpty()) {
494- globalExclusions.addAll(exclusions)
495- }
496499 if (packages.isNotEmpty() || testPackages.isNotEmpty()) {
497500 repos.forEach { repo ->
498501 if (repo.key !in repositories) {
499502 repo.value.name = repo.key
500503 repositories[repo.key] = repo.value
501504 }
502505 }
506+ if (exclusions.isNotEmpty()) registerGlobalExclusions(
507+ exclusions,
508+ )
503509 registerPackages(
504510 " main" ,
505511 state.manifest,
@@ -629,6 +635,28 @@ public class MavenAetherResolver internal constructor (
629635 }
630636 }
631637
638+ private fun checkIsExcluded (node : DependencyNode ): Boolean {
639+ if (node.artifact == null ) {
640+ return true // not loaded yet, or a symbolic artifact, like a pom-only dist
641+ }
642+ val coord = buildString {
643+ append(node.artifact.groupId)
644+ append(' :' )
645+ append(node.artifact.artifactId)
646+ }
647+ val globallyExcluded = globalExclusions.contains(MavenPackage (
648+ group = node.artifact.groupId,
649+ name = node.artifact.artifactId,
650+ classifier = node.artifact.classifier,
651+ coordinate = coord,
652+ ))
653+ return when {
654+ // global exclusions take precedence
655+ globallyExcluded -> true
656+ else -> false // not excluded by default
657+ }
658+ }
659+
632660 override suspend fun resolve (scope : CoroutineScope ): Sequence <Job > {
633661 check(initialized.value) { " Resolver must be initialized before resolving" }
634662 check(sealed.value) { " Resolver must be sealed before resolving" }
@@ -645,7 +673,11 @@ public class MavenAetherResolver internal constructor (
645673
646674 return sequence {
647675 yield (scope.async {
648- val dependencyRequest = DependencyRequest (graph, null )
676+ val dependencyRequest = DependencyRequest (graph, object : DependencyFilter {
677+ override fun accept (node : DependencyNode , parents : List <DependencyNode >): Boolean {
678+ return parents.isEmpty() || ! checkIsExcluded(node)
679+ }
680+ })
649681 val dependencyResult = system.resolveDependencies(session, dependencyRequest)
650682 logging.debug { " Maven dependency resolution result: $dependencyResult " }
651683 var errors = mutableListOf<Throwable >()
@@ -699,18 +731,23 @@ public class MavenAetherResolver internal constructor (
699731 override val usage: MultiPathUsage ? get() = it.type
700732 })
701733 }
702- }.let { _ ->
734+ }.let { suite ->
703735 ClasspathProvider {
704- // assemble a class-path from all resolved artifacts for a given spec
705- // Classpath.from((registryByType[suite] ?: emptyList()).flatMap { pkg ->
706- // packageArtifacts[pkg]?.files?.map {
707- // it.toPath()
708- // } ?: emptyList()
709- // })
710- // @TODO don't return all artifacts, only those for the suite
711736 Classpath .from(
712737 packageArtifacts
713738 .filter { it.key !in globalExclusions }
739+ .filter {
740+ when (spec) {
741+ null -> true
742+ else -> when (val usage = registry[" ${it.key.coordinate} :${it.key.version} " ]?.second) {
743+ null -> spec.usage == MultiPathUsage .Compile // can't prove it's for this; include for compile
744+ else -> spec.test(object : ClasspathSpec {
745+ override val name: String? get() = suite?.name
746+ override val usage: MultiPathUsage ? get() = usage
747+ })
748+ }
749+ }
750+ }
714751 .flatMap { it.value.files }
715752 .map { it.toPath().absolute() }
716753 .distinct()
0 commit comments