You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@maven.apache.org by "desruisseaux (via GitHub)" <gi...@apache.org> on 2025/12/03 11:10:49 UTC

Re: [PR] Add module-aware resource handling for modular sources [maven]

desruisseaux commented on code in PR #11505:
URL: https://github.com/apache/maven/pull/11505#discussion_r2584687495


##########
impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java:
##########
@@ -700,11 +709,149 @@ private void initProject(MavenProject project, ModelBuilderResult result) {
                 if (!hasTest) {
                     project.addTestCompileSourceRoot(build.getTestSourceDirectory());
                 }
-                for (Resource resource : project.getBuild().getDelegate().getResources()) {
-                    project.addSourceRoot(new DefaultSourceRoot(baseDir, ProjectScope.MAIN, resource));
+                // Extract modules from sources to detect modular projects
+                Set<String> modules = extractModules(sources);
+                boolean isModularProject = !modules.isEmpty();
+
+                logger.debug(
+                        "Module detection for project {}: found {} module(s) {} - modular project: {}",
+                        project.getId(),
+                        modules.size(),
+                        modules,
+                        isModularProject);
+
+                /*
+                 * Handle main resources - modular project has highest priority:
+                 * 1. Modular project: use resources from <sources> if present, otherwise inject defaults
+                 * 2. Classic project: use resources from <sources> if present, otherwise use legacy <resources>
+                 */
+                List<Resource> resources = project.getBuild().getDelegate().getResources();
+                if (isModularProject) {
+                    if (hasMainResources) {
+                        // Modular project with resources configured via <sources> - already added above
+                        if (!resources.isEmpty()
+                                && !hasOnlySuperPomDefaults(resources, baseDir, ProjectScope.MAIN.id())) {
+                            logger.warn("Legacy <resources> element is ignored because main resources are "
+                                    + "configured via <source><lang>resources</lang></source> in <sources>");
+                        }
+                        logger.debug(
+                                "Main resources configured via <sources> element, ignoring legacy <resources> element");
+                    } else {
+                        // Modular project without resources in <sources> - inject module-aware defaults
+                        if (!resources.isEmpty()
+                                && !hasOnlySuperPomDefaults(resources, baseDir, ProjectScope.MAIN.id())) {
+                            String message =
+                                    "Legacy <resources> element is ignored because modular sources are configured. "
+                                            + "Use <source><lang>resources</lang></source> in <sources> for custom resource paths.";
+                            logger.warn(message);
+                            result.getProblemCollector()
+                                    .reportProblem(new org.apache.maven.impl.model.DefaultModelProblem(
+                                            message,
+                                            Severity.WARNING,
+                                            Version.V41,
+                                            project.getModel().getDelegate(),
+                                            -1,
+                                            -1,
+                                            null));
+                        }
+                        logger.debug("Injecting module-aware main resource roots for {} modules", modules.size());
+                        for (String module : modules) {
+                            Path resourcePath = baseDir.resolve("src")
+                                    .resolve(module)
+                                    .resolve(ProjectScope.MAIN.id())
+                                    .resolve("resources");
+                            logger.debug("  - Adding main resource root: {} (module: {})", resourcePath, module);
+                            project.addSourceRoot(
+                                    createModularResourceRoot(baseDir, module, ProjectScope.MAIN, outputDirectory));
+                        }
+                    }
+                } else {
+                    // Classic (non-modular) project
+                    if (hasMainResources) {
+                        // Resources configured via <sources> - already added above
+                        if (!resources.isEmpty()
+                                && !hasOnlySuperPomDefaults(resources, baseDir, ProjectScope.MAIN.id())) {
+                            logger.warn("Legacy <resources> element is ignored because main resources are "
+                                    + "configured via <source><lang>resources</lang></source> in <sources>");
+                        }
+                        logger.debug(
+                                "Main resources configured via <sources> element, ignoring legacy <resources> element");
+                    } else {
+                        // Use legacy <resources> element
+                        logger.debug("Using explicit or default resources ({} resources configured)", resources.size());
+                        for (Resource resource : resources) {
+                            project.addSourceRoot(new DefaultSourceRoot(baseDir, ProjectScope.MAIN, resource));
+                        }
+                    }
                 }
-                for (Resource resource : project.getBuild().getDelegate().getTestResources()) {
-                    project.addSourceRoot(new DefaultSourceRoot(baseDir, ProjectScope.TEST, resource));
+
+                /*

Review Comment:
   This block of code for test resources seems very similar to above code for main resources, with only minor differences. Can we share the code in a single method?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@maven.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org