Reputation: 27958
I want to generate an effective pom for all the subprojects in a multi-module build.
The help:effective-pom
documentation here states
It will iterate over all projects in the current build session, printing the effective POM for each
I'm running mvn help:effective-pom
in the root directory of this maven project and it's only generating for the root and not for the subprojects.
Why isn't the effective pom being generated for all projects. Note: I have another real world maven project where mvn help:effective-pom
is correctly generating a <projects>
tag with nested <project>
for each submodule. I am unsure why it is not working for this maven project
Here is the effective pom generated
<!-- ====================================================================== -->
<!-- -->
<!-- Generated by Maven Help Plugin on 2017-11-12T09:56:26 -->
<!-- See: http://maven.apache.org/plugins/maven-help-plugin/ -->
<!-- -->
<!-- ====================================================================== -->
<!-- ====================================================================== -->
<!-- -->
<!-- Effective POM for project -->
<!-- 'org.gradle.test.performance:project:pom:1.0' -->
<!-- -->
<!-- ====================================================================== -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.gradle.test.performance</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>project0</module>
<module>project1</module>
<module>project2</module>
<module>project3</module>
<module>project4</module>
<module>project5</module>
<module>project6</module>
<module>project7</module>
<module>project8</module>
<module>project9</module>
</modules>
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
</pluginRepository>
</pluginRepositories>
<build>
<sourceDirectory>C:\code\gradle-maven-transform\example\smallJavaMultiProject\src\main\java</sourceDirectory>
<scriptSourceDirectory>C:\code\gradle-maven-transform\example\smallJavaMultiProject\src\main\scripts</scriptSourceDirectory>
<testSourceDirectory>C:\code\gradle-maven-transform\example\smallJavaMultiProject\src\test\java</testSourceDirectory>
<outputDirectory>C:\code\gradle-maven-transform\example\smallJavaMultiProject\target\classes</outputDirectory>
<testOutputDirectory>C:\code\gradle-maven-transform\example\smallJavaMultiProject\target\test-classes</testOutputDirectory>
<resources>
<resource>
<directory>C:\code\gradle-maven-transform\example\smallJavaMultiProject\src\main\resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>C:\code\gradle-maven-transform\example\smallJavaMultiProject\src\test\resources</directory>
</testResource>
</testResources>
<directory>C:\code\gradle-maven-transform\example\smallJavaMultiProject\target</directory>
<finalName>project-1.0</finalName>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.3.2</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>default-clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>default-install</id>
<phase>install</phase>
<goals>
<goal>install</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<id>default-deploy</id>
<phase>deploy</phase>
<goals>
<goal>deploy</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.3</version>
<executions>
<execution>
<id>default-site</id>
<phase>site</phase>
<goals>
<goal>site</goal>
</goals>
<configuration>
<outputDirectory>C:\code\gradle-maven-transform\example\smallJavaMultiProject\target\site</outputDirectory>
<reportPlugins>
<reportPlugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
</reportPlugin>
</reportPlugins>
</configuration>
</execution>
<execution>
<id>default-deploy</id>
<phase>site-deploy</phase>
<goals>
<goal>deploy</goal>
</goals>
<configuration>
<outputDirectory>C:\code\gradle-maven-transform\example\smallJavaMultiProject\target\site</outputDirectory>
<reportPlugins>
<reportPlugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
</reportPlugin>
</reportPlugins>
</configuration>
</execution>
</executions>
<configuration>
<outputDirectory>C:\code\gradle-maven-transform\example\smallJavaMultiProject\target\site</outputDirectory>
<reportPlugins>
<reportPlugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
</reportPlugin>
</reportPlugins>
</configuration>
</plugin>
</plugins>
</build>
<reporting>
<outputDirectory>C:\code\gradle-maven-transform\example\smallJavaMultiProject\target\site</outputDirectory>
</reporting>
</project>
Upvotes: 10
Views: 10636
Reputation: 27958
I ended up with a different solution in the end. Rather than accepting a single root pom.xml
as input, I instead require a collection of pom.xml
to be resolved. I also now embed the maven-model-builder
and invoke the DefaultModelBuilder
via a DefaultModelBuildingRequest
Eg:
DefaultModelBuilderFactory factory = new DefaultModelBuilderFactory();
DefaultModelBuilder builder = factory.newInstance();
ModelBuildingRequest req = new DefaultModelBuildingRequest();
req.setProcessPlugins(false);
req.setModelResolver(createModelResolver());
req.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);
for (File pomFile : pomFiles) {
req.setPomFile(pomFile);
Model effectivePom = builder.build(req).getEffectiveModel();
...
}
Code here for anyone interested
Upvotes: 2
Reputation: 15308
The EffectivePomMojo is an aggregator goal. Which means it's invoked only for the module that you run it for. But you're right that it should dump all the sub-projects as well. The reason it doesn't do this in your case is because of this line:
if ( projects.get( 0 ).equals( project ) && projects.size() > 1 )
In your case the upper-most project is last in the graph (because there are no dependencies on it from any other module). If you add it as a parent to project0 (and only for that module), then it'd put your root pom at the 1st position in the graph and everything will work as you expect.
I can't come up with a justification for this behaviour. So if you raise an issue in the bugtracker everyone will benefit :) Please update us if/when you get the answer.
PS: such questions are easy to solve if you know how to debug Maven plugins. For this you can use mvnDebug
instead of mvn
and then open plugin's source code and attach to the debug session.
Upvotes: 4
Reputation: 12923
You need to specify the parent
element in each of your sub-modules pom.xml
in addition to the modules
elements in your root project such as:
<parent>
<groupId>org.gradle.test.performance</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
</parent>
Otherwise it won't be picked-up when you run help:effective-pom
command.
EDIT: some precision as to why the plugin does not work with Aggregation. Aggregation (done with modules
element) is different than Inheritance (using the parent
element). However the plugin documentation clearly mentions:
The effective-pom goal is used to make visible the POM that results from the application of interpolation, inheritance and active profiles.
And there is no mention of aggregated plugins. I believe it basically means:
I will take the pom you are providing me, apply interpolation, inheritance and active profiles but NOT aggregation, and give you the resulting pom. Deal with it.
Upvotes: 2