diff --git a/src/main/scala/bloop/integrations/maven/MojoImplementation.scala b/src/main/scala/bloop/integrations/maven/MojoImplementation.scala
index 2bad020..3e2abcd 100644
--- a/src/main/scala/bloop/integrations/maven/MojoImplementation.scala
+++ b/src/main/scala/bloop/integrations/maven/MojoImplementation.scala
@@ -291,10 +291,18 @@ object MojoImplementation {
val resolution = Some(Config.Resolution(modules))
val (classpath, runtimeClasspath) = {
+ // keys of artifacts that survived Maven's exclusion resolution for this module.
+ val resolvedArtifactKeys: Set[String] = project.getArtifacts.asScala
+ .map(a => ArtifactUtils.versionlessKey(a))
+ .toSet
+
val projectDependencies = dependencies.flatMap { d =>
- val build = d.getBuild()
- if (configuration == "compile") build.getOutputDirectory() :: Nil
- else build.getTestOutputDirectory() :: build.getOutputDirectory() :: Nil
+ if (!resolvedArtifactKeys.contains(ArtifactUtils.versionlessKey(d.getArtifact))) Nil
+ else {
+ val build = d.getBuild()
+ if (configuration == "compile") build.getOutputDirectory() :: Nil
+ else build.getTestOutputDirectory() :: build.getOutputDirectory() :: Nil
+ }
}
val cp = classpath0().asScala.toList.asInstanceOf[List[String]].map(u => abs(new File(u)))
diff --git a/src/test/resources/exclusion/api/pom.xml b/src/test/resources/exclusion/api/pom.xml
new file mode 100644
index 0000000..a2c3ba2
--- /dev/null
+++ b/src/test/resources/exclusion/api/pom.xml
@@ -0,0 +1,17 @@
+
+ 4.0.0
+
+ com.example
+ exclusion
+ 0.1
+
+ api
+
+
+
+ com.example
+ shims
+ 0.1
+
+
+
diff --git a/src/test/resources/exclusion/consumer/pom.xml b/src/test/resources/exclusion/consumer/pom.xml
new file mode 100644
index 0000000..0c470aa
--- /dev/null
+++ b/src/test/resources/exclusion/consumer/pom.xml
@@ -0,0 +1,23 @@
+
+ 4.0.0
+
+ com.example
+ exclusion
+ 0.1
+
+ consumer
+
+
+
+ com.example
+ api
+ 0.1
+
+
+ com.example
+ shims
+
+
+
+
+
diff --git a/src/test/resources/exclusion/pom.xml b/src/test/resources/exclusion/pom.xml
new file mode 100644
index 0000000..a6dda69
--- /dev/null
+++ b/src/test/resources/exclusion/pom.xml
@@ -0,0 +1,13 @@
+
+ 4.0.0
+ com.example
+ exclusion
+ 0.1
+ pom
+
+
+ shims
+ api
+ consumer
+
+
diff --git a/src/test/resources/exclusion/shims/pom.xml b/src/test/resources/exclusion/shims/pom.xml
new file mode 100644
index 0000000..e710819
--- /dev/null
+++ b/src/test/resources/exclusion/shims/pom.xml
@@ -0,0 +1,9 @@
+
+ 4.0.0
+
+ com.example
+ exclusion
+ 0.1
+
+ shims
+
diff --git a/src/test/scala/bloop/integrations/maven/MavenConfigGenerationTest.scala b/src/test/scala/bloop/integrations/maven/MavenConfigGenerationTest.scala
index a8093e7..9a8fbbe 100644
--- a/src/test/scala/bloop/integrations/maven/MavenConfigGenerationTest.scala
+++ b/src/test/scala/bloop/integrations/maven/MavenConfigGenerationTest.scala
@@ -544,6 +544,39 @@ class MavenConfigGenerationTest extends BaseConfigSuite {
}
}
+ @Test
+ def exclusion() = {
+ check(
+ "exclusion/pom.xml",
+ submodules = List(
+ "exclusion/shims/pom.xml",
+ "exclusion/api/pom.xml",
+ "exclusion/consumer/pom.xml"
+ )
+ ) {
+ case (_, _, List(_, apiConfig, consumerConfig)) =>
+ // api depends on shims — shims output dir must be on api's classpath
+ assert(
+ hasCompileClasspathEntryName(apiConfig, "shims"),
+ "api should have shims on its compile classpath"
+ )
+
+ // consumer explicitly excludes shims — its output dir must NOT appear
+ assert(
+ !hasCompileClasspathEntryName(consumerConfig, "shims"),
+ "consumer should not have shims on its compile classpath"
+ )
+
+ // api itself must still be on consumer's classpath
+ assert(
+ hasCompileClasspathEntryName(consumerConfig, "api"),
+ "consumer should still have api on its compile classpath"
+ )
+ case _ =>
+ assert(false, "exclusion should have exactly three submodules")
+ }
+ }
+
@Test
def runtimeDependency() = {
check("runtime_dependency/pom.xml") { (configFile, projectName, subprojects) =>