diff --git a/devtools/maven/src/main/java/io/quarkus/maven/DevMojo.java b/devtools/maven/src/main/java/io/quarkus/maven/DevMojo.java index 40e2d4a1345f0..848cd78bedcc9 100644 --- a/devtools/maven/src/main/java/io/quarkus/maven/DevMojo.java +++ b/devtools/maven/src/main/java/io/quarkus/maven/DevMojo.java @@ -1139,7 +1139,9 @@ private QuarkusDevModeLauncher newLauncher(Boolean debugPortOk, String bootstrap .setRemoteRepositories(repos) .setWorkspaceDiscovery(true) .setPreferPomsFromWorkspace(true) - .setCurrentProject(project.getFile().toString()); + // it's important to set the base directory instead of the POM + // which maybe manipulated by a plugin and stored outside the base directory + .setCurrentProject(project.getBasedir().toString()); // There are a couple of reasons we don't want to use the original Maven session: // 1) a reload could be triggered by a change in a pom.xml, in which case the Maven session might not be in sync any more with the effective POM; diff --git a/devtools/maven/src/main/java/io/quarkus/maven/QuarkusBootstrapProvider.java b/devtools/maven/src/main/java/io/quarkus/maven/QuarkusBootstrapProvider.java index 2af84e5146410..36bcdf8908ca3 100644 --- a/devtools/maven/src/main/java/io/quarkus/maven/QuarkusBootstrapProvider.java +++ b/devtools/maven/src/main/java/io/quarkus/maven/QuarkusBootstrapProvider.java @@ -87,6 +87,14 @@ static Map getProjectMap(MavenSession session) { // activated profiles or custom extensions may have overridden the build defaults model.setBuild(mp.getModel().getBuild()); projectModels.put(mp.getBasedir().toPath(), model); + // The Maven Model API determines the project directory as the directory containing the POM file. + // However, in case when plugins manipulating POMs store their results elsewhere + // (such as the flatten plugin storing the flattened POM under the target directory), + // both the base directory and the directory containing the POM file should be added to the map. + var pomDir = mp.getFile().getParentFile(); + if (!pomDir.equals(mp.getBasedir())) { + projectModels.put(pomDir.toPath(), model); + } } return projectModels; } diff --git a/integration-tests/maven/src/test/java/io/quarkus/maven/it/DevMojoIT.java b/integration-tests/maven/src/test/java/io/quarkus/maven/it/DevMojoIT.java index 0628e65640f2a..787e406680290 100644 --- a/integration-tests/maven/src/test/java/io/quarkus/maven/it/DevMojoIT.java +++ b/integration-tests/maven/src/test/java/io/quarkus/maven/it/DevMojoIT.java @@ -62,9 +62,16 @@ protected ContinuousTestingMavenTestUtils getTestingTestUtils() { return new ContinuousTestingMavenTestUtils(); } + @Test + public void testFlattenedPomInTargetDir() throws MavenInvocationException, IOException { + testDir = initProject("projects/pom-in-target-dir"); + run(true); + assertThat(DevModeTestUtils.getHttpResponse("/hello")).isEqualTo("Hello from RESTEasy Reactive"); + } + @Test public void testConfigFactoryInAppModuleBannedInCodeGen() throws MavenInvocationException, IOException { - testDir = initProject("projects/codegen-config-factory", "project/codegen-config-factory-banned"); + testDir = initProject("projects/codegen-config-factory", "projects/codegen-config-factory-banned"); run(true); assertThat(DevModeTestUtils.getHttpResponse("/codegen-config/acme-config-factory")).isEqualTo("n/a"); assertThat(DevModeTestUtils.getHttpResponse("/codegen-config/acme-config-provider")).isEqualTo("n/a"); diff --git a/integration-tests/maven/src/test/resources-filtered/projects/pom-in-target-dir/pom.xml b/integration-tests/maven/src/test/resources-filtered/projects/pom-in-target-dir/pom.xml new file mode 100644 index 0000000000000..e7a2ccb3e3954 --- /dev/null +++ b/integration-tests/maven/src/test/resources-filtered/projects/pom-in-target-dir/pom.xml @@ -0,0 +1,91 @@ + + + 4.0.0 + org.acme + code-with-quarkus + 1.0.0-SNAPSHOT + + ${compiler-plugin.version} + 11 + UTF-8 + UTF-8 + quarkus-bom + io.quarkus + ${project.version} + + + + + \${quarkus.platform.group-id} + \${quarkus.platform.artifact-id} + \${quarkus.platform.version} + pom + import + + + + + + io.quarkus + quarkus-resteasy-reactive + + + + + + org.codehaus.mojo + flatten-maven-plugin + 1.5.0 + + target + + keep + keep + keep + + + + + flatten + process-resources + + flatten + + + + flatten.clean + clean + + clean + + + + + + \${quarkus.platform.group-id} + quarkus-maven-plugin + \${quarkus.platform.version} + true + + + + build + generate-code + generate-code-tests + + + + + + maven-compiler-plugin + \${compiler-plugin.version} + + + -parameters + + + + + + diff --git a/integration-tests/maven/src/test/resources-filtered/projects/pom-in-target-dir/src/main/java/org/acme/GreetingResource.java b/integration-tests/maven/src/test/resources-filtered/projects/pom-in-target-dir/src/main/java/org/acme/GreetingResource.java new file mode 100644 index 0000000000000..6938062ec8ff7 --- /dev/null +++ b/integration-tests/maven/src/test/resources-filtered/projects/pom-in-target-dir/src/main/java/org/acme/GreetingResource.java @@ -0,0 +1,16 @@ +package org.acme; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +@Path("/hello") +public class GreetingResource { + + @GET + @Produces(MediaType.TEXT_PLAIN) + public String hello() { + return "Hello from RESTEasy Reactive"; + } +}