diff --git a/src/main/scala/bloop/integrations/maven/MojoImplementation.scala b/src/main/scala/bloop/integrations/maven/MojoImplementation.scala
index 6126424..13876a3 100644
--- a/src/main/scala/bloop/integrations/maven/MojoImplementation.scala
+++ b/src/main/scala/bloop/integrations/maven/MojoImplementation.scala
@@ -129,6 +129,18 @@ object MojoImplementation {
}
}
+ val reactorArtifactIds = session.getProjects().asScala.map(_.getArtifactId).toSet
+
+ def getBloopName(artifactId: String, configuration: String): String = {
+ configuration match {
+ case "compile" => artifactId
+ case _ =>
+ val defaultName = s"$artifactId-$configuration"
+ if (reactorArtifactIds.contains(defaultName)) s"$artifactId-$configuration-scope"
+ else defaultName
+ }
+ }
+
val reactorProjectsSet = mojo
.getReactorProjects()
.asScala
@@ -153,7 +165,7 @@ object MojoImplementation {
log.info(s"Dependency $dep, $matchingArtifacts")
matchingArtifacts
.collect {
- case artifact if artifact.getType == "test-jar" => dep.getArtifactId + "-test"
+ case artifact if artifact.getType == "test-jar" => getBloopName(dep.getArtifactId, "test")
}
.toList
.appended(dep.getArtifactId)
@@ -201,8 +213,7 @@ object MojoImplementation {
launcher: Option[AppLauncher],
configuration: String
): Unit = {
- val suffix = if (configuration == "compile") "" else s"-$configuration"
- val name = project.getArtifactId() + suffix
+ val name = getBloopName(project.getArtifactId(), configuration)
val build = project.getBuild()
val baseDirectory = abs(project.getBasedir())
val out = baseDirectory.resolve("target")
@@ -335,6 +346,12 @@ object MojoImplementation {
log.info(s"Generated $finalTarget")
log.debug(s"Configuration to be serialized:\n$config")
bloop.config.write(config, configTarget.toPath)
+
+ log.info(s"Starting to write configuration for project: ${project.getArtifactId()} with configuration: $configuration")
+ log.debug(s"Source directories: ${sourceDirs0.map(_.getAbsolutePath).mkString(", ")}")
+ log.debug(s"Classpath: ${classpath0().asScala.mkString(", ")}")
+ log.debug(s"Resources: ${resources0.asScala.mkString(", ")}")
+ log.debug(s"Output directory: ${classesDir0.getAbsolutePath}")
}
writeConfig(
diff --git a/src/test/resources/conflicting_modules/module1-test/pom.xml b/src/test/resources/conflicting_modules/module1-test/pom.xml
new file mode 100644
index 0000000..5081e19
--- /dev/null
+++ b/src/test/resources/conflicting_modules/module1-test/pom.xml
@@ -0,0 +1,33 @@
+
+ 4.0.0
+ com.example
+ module1-test
+ 0.1
+ module1-test
+
+
+ com.example
+ conflicting_modules
+ 0.1
+
+
+
+
+ org.scala-lang
+ scala-library
+ 2.13.6
+
+
+
+
+ src/main/scala
+ src/test/scala
+
+
+ net.alchim31.maven
+ scala-maven-plugin
+ 3.3.2
+
+
+
+
diff --git a/src/test/resources/conflicting_modules/module1/pom.xml b/src/test/resources/conflicting_modules/module1/pom.xml
new file mode 100644
index 0000000..ef3ee37
--- /dev/null
+++ b/src/test/resources/conflicting_modules/module1/pom.xml
@@ -0,0 +1,33 @@
+
+ 4.0.0
+ com.example
+ module1
+ 0.1
+ module1
+
+
+ com.example
+ conflicting_modules
+ 0.1
+
+
+
+
+ org.scala-lang
+ scala-library
+ 2.13.6
+
+
+
+
+ src/main/scala
+ src/test/scala
+
+
+ net.alchim31.maven
+ scala-maven-plugin
+ 3.3.2
+
+
+
+
diff --git a/src/test/resources/conflicting_modules/pom.xml b/src/test/resources/conflicting_modules/pom.xml
new file mode 100644
index 0000000..252505a
--- /dev/null
+++ b/src/test/resources/conflicting_modules/pom.xml
@@ -0,0 +1,21 @@
+
+ 4.0.0
+ com.example
+ conflicting_modules
+ 0.1
+ pom
+ conflicting_modules
+ Project with conflicting module names.
+
+
+ 1.8
+ 1.8
+ UTF-8
+
+
+
+ module1
+ module1-test
+
+
+
diff --git a/src/test/resources/multi_module_test_jar/bar/pom.xml b/src/test/resources/multi_module_test_jar/bar/pom.xml
index 21cdd89..9ca9c58 100644
--- a/src/test/resources/multi_module_test_jar/bar/pom.xml
+++ b/src/test/resources/multi_module_test_jar/bar/pom.xml
@@ -17,6 +17,7 @@
org.scala-lang
scala-library
+ ${scala.version}
com.example
diff --git a/src/test/resources/multi_module_test_jar/foo/pom.xml b/src/test/resources/multi_module_test_jar/foo/pom.xml
index cb550b0..c5c3918 100644
--- a/src/test/resources/multi_module_test_jar/foo/pom.xml
+++ b/src/test/resources/multi_module_test_jar/foo/pom.xml
@@ -17,6 +17,7 @@
org.scala-lang
scala-library
+ ${scala.version}
diff --git a/src/test/scala/bloop/integrations/maven/MavenConfigGenerationTest.scala b/src/test/scala/bloop/integrations/maven/MavenConfigGenerationTest.scala
index 1a198b0..e1dfd61 100644
--- a/src/test/scala/bloop/integrations/maven/MavenConfigGenerationTest.scala
+++ b/src/test/scala/bloop/integrations/maven/MavenConfigGenerationTest.scala
@@ -202,6 +202,45 @@ class MavenConfigGenerationTest extends BaseConfigSuite {
}
}
+ @Test
+ def conflictingSubmodules() = {
+ check(
+ "conflicting_modules/pom.xml",
+ submodules = List(
+ "conflicting_modules/module1/pom.xml",
+ "conflicting_modules/module1-test/pom.xml"
+ )
+ ) {
+ case (configFile, projectName, List(module1, module2)) =>
+ // module1 is "module1"
+ // module2 is "module1-test"
+
+ // module1's test configuration should be renamed to avoid conflict with module2
+ // Default would be "module1-test", but "module1-test" exists as a reactor artifact (module2)
+ // So it should be "module1-test-scope"
+ assertEquals("module1", module1.project.name)
+
+ // We need to check the test configuration name for module1.
+ // check() function loads the "compile" configuration (default expectation in this test suite assumption?)
+ // Actually check() loads the config based on the project file name.
+ // module1 comes from "conflicting_modules/module1/pom.xml" -> parent dir is "module1".
+ // The bloop file loaded is "module1.json".
+
+ // Let's check the test config of module1
+ val module1TestConfigPath = configFile.project.directory.resolve(".bloop").resolve("module1-test-scope.json")
+ assertTrue(s"Test config for module1 should be renamed to module1-test-scope.json", Files.exists(module1TestConfigPath))
+
+ val module1TestConfig = readValidBloopConfig(module1TestConfigPath.toFile())
+ assertEquals("module1-test-scope", module1TestConfig.project.name)
+
+ // module2 should start with module1-test
+ assertEquals("module1-test", module2.project.name)
+
+ case _ =>
+ fail("Conflicting modules test should have 2 submodules")
+ }
+ }
+
@Test
def dependencyTestJars() = {
check("test_jars/pom.xml") { (configFile, projectName, subprojects) =>
@@ -260,6 +299,29 @@ class MavenConfigGenerationTest extends BaseConfigSuite {
}
}
+ @Test
+ def testFallbackNamingForTestScope() = {
+ check(
+ "multi_dependency/pom.xml",
+ submodules = List("multi_dependency/module1/pom.xml", "multi_dependency/module2/pom.xml")
+ ) {
+ case (configFile, projectName, submodulesList) =>
+ val (module1: Config.File, module2: Config.File) = submodulesList match {
+ case List(m1, m2) => (m1, m2)
+ case _ => fail(s"Expected 2 submodules, but got ${submodulesList.size}")
+ }
+
+ // Standard naming should be preserved when no collision exists
+ assert(!configFile.project.name.contains("-compile"))
+ assert(!module1.project.name.contains("-compile"))
+ assert(!module2.project.name.contains("-compile"))
+
+ // Note: To test actual collision, we would need to construct a project structure
+ // where a submodule name conflicts with the test suffix of another module.
+ // For now, we verify that the default behavior is correct (no suffixes).
+ }
+ }
+
@Test
def junitSupport() = {
check("junit_project/pom.xml") { (configFile, projectName, subprojects) =>
@@ -328,6 +390,7 @@ class MavenConfigGenerationTest extends BaseConfigSuite {
val projectName = projectPath.toFile().getName()
val bloopDir = projectPath.resolve(".bloop")
val projectFile = bloopDir.resolve(s"${projectName}.json")
+
val configFile = readValidBloopConfig(projectFile.toFile())
val subProjects = submodules.map { mod =>
@@ -362,7 +425,7 @@ class MavenConfigGenerationTest extends BaseConfigSuite {
val processBuilder = new ProcessBuilder()
val out = new StringBuilder()
processBuilder.directory(cwd)
- processBuilder.command(cmd: _*);
+ processBuilder.command(cmd: _*)
var process = processBuilder.start()
val reader =
@@ -373,6 +436,9 @@ class MavenConfigGenerationTest extends BaseConfigSuite {
out.append(line + "\n")
line = reader.readLine()
}
+
+ val exitCode = process.waitFor()
+
out.toString()
}
}