From 8e867a6d536d1275392fbd5185114aafcfe07676 Mon Sep 17 00:00:00 2001 From: Martin Desruisseaux Date: Sun, 11 Jan 2026 14:22:40 +0100 Subject: [PATCH] Consumer POM of multi-module project should exclude and elements. --- .../impl/ConsumerPomArtifactTransformer.java | 2 +- .../impl/DefaultConsumerPomBuilder.java | 28 +++++++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/impl/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/ConsumerPomArtifactTransformer.java b/impl/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/ConsumerPomArtifactTransformer.java index 9444f972a9be..f32c96288657 100644 --- a/impl/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/ConsumerPomArtifactTransformer.java +++ b/impl/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/ConsumerPomArtifactTransformer.java @@ -96,7 +96,7 @@ public void injectTransformedArtifacts(RepositorySystemSession session, MavenPro } } - TransformedArtifact createConsumerPomArtifact( + private TransformedArtifact createConsumerPomArtifact( MavenProject project, Path consumer, RepositorySystemSession session) { Path actual = project.getFile().toPath(); Path parent = project.getBaseDirectory(); diff --git a/impl/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java b/impl/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java index c46d3d5b6d31..c4e975fc358b 100644 --- a/impl/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java +++ b/impl/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java @@ -32,6 +32,7 @@ import org.apache.maven.api.Node; import org.apache.maven.api.PathScope; import org.apache.maven.api.SessionData; +import org.apache.maven.api.SourceRoot; import org.apache.maven.api.feature.Features; import org.apache.maven.api.model.Dependency; import org.apache.maven.api.model.DistributionManagement; @@ -342,7 +343,7 @@ static Model transformNonPom(Model model, MavenProject project) { return model; } - static Model transformBom(Model model, MavenProject project) { + private static Model transformBom(Model model, MavenProject project) { boolean preserveModelVersion = model.isPreserveModelVersion(); Model.Builder builder = prune( @@ -372,7 +373,13 @@ static Model transformPom(Model model, MavenProject project) { if (model.getParent() != null) { model = model.withParent(model.getParent().withRelativePath(null)); } - + if (isModular(project)) { + // Build information are not really needed by consumers. Removed because the elements + // are not compatible with Maven 4.0.0 model, and the remaining is not valid without them. + model = model.withBuild(null); + // Dependencies are dispatched by maven-jar-plugin in the POM generated for each module. + model = model.withDependencies(null); + } if (!preserveModelVersion) { model = model.withPreserveModelVersion(false); String modelVersion = new MavenModelVersion().getModelVersion(model); @@ -381,7 +388,22 @@ static Model transformPom(Model model, MavenProject project) { return model; } - static void warnNotDowngraded(MavenProject project) { + /** + * Whether the given project is modular. This method returns {@code true} it at least one enabled + * {@code } element declares a Java modules. While modular and non-modular sources should + * not be mixed, this code is tolerant to such mixes because non-modular source elements may have + * been incorrectly generated by non module-aware codes, in which case they should be ignored. + */ + private static boolean isModular(MavenProject project) { + for (SourceRoot source : project.getSourceRoots()) { + if (source.enabled() && source.module().isPresent()) { + return true; + } + } + return false; + } + + private static void warnNotDowngraded(MavenProject project) { LOGGER.warn("The consumer POM for " + project.getId() + " cannot be downgraded to 4.0.0. " + "If you intent your build to be consumed with Maven 3 projects, you need to remove " + "the features that request a newer model version. If you're fine with having the "