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) =>