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() } }