| ~~ Licensed to the Apache Software Foundation (ASF) under one |
| ~~ or more contributor license agreements. See the NOTICE file |
| ~~ distributed with this work for additional information |
| ~~ regarding copyright ownership. The ASF licenses this file |
| ~~ to you under the Apache License, Version 2.0 (the |
| ~~ "License"); you may not use this file except in compliance |
| ~~ with the License. You may obtain a copy of the License at |
| ~~ |
| ~~ http://www.apache.org/licenses/LICENSE-2.0 |
| ~~ |
| ~~ Unless required by applicable law or agreed to in writing, |
| ~~ software distributed under the License is distributed on an |
| ~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| ~~ KIND, either express or implied. See the License for the |
| ~~ specific language governing permissions and limitations |
| ~~ under the License. |
| |
| ------ |
| Reactor Module Convergence |
| ------ |
| Karl-Heinz Marbaise |
| ------ |
| March 2014 |
| ------ |
| |
| Reactor Module Convergence |
| |
| This rule checks that the versions within the reactor are consistent furthermore |
| it will check that every module within the project contains a parent and that the |
| parent is part of the reactor build. Furthermore it will be checked if dependencies |
| are intermodule dependencies that they using the same version as given by the reactor. |
| |
| The following parameters are supported by this rule: |
| |
| * message - an optional supplemental message to the user if the rule fails. |
| |
| * ignoreModuleDependencies - Ignore module dependencies which references modules within the |
| the reactor (default: false). |
| |
| Note: The current state does not correctly handle a situation like this {{mvn -pl subproject validate}}. |
| This will be handled correctly with the next major release (2.X) of enforcer. |
| |
| [] |
| |
| |
| Sample Plugin Configuration: |
| |
| +---+ |
| <project> |
| [...] |
| <build> |
| <plugins> |
| <plugin> |
| <groupId>org.apache.maven.plugins</groupId> |
| <artifactId>maven-enforcer-plugin</artifactId> |
| <version>${project.version}</version> |
| <executions> |
| <execution> |
| <id>enforce-no-snapshots</id> |
| <goals> |
| <goal>enforce</goal> |
| </goals> |
| <configuration> |
| <rules> |
| <reactorModuleConvergence> |
| <message>The reactor is not valid</message> |
| <ignoreModuleDependencies>true</ignoreModuleDependencies> |
| </reactorModuleConvergence> |
| </rules> |
| <fail>true</fail> |
| </configuration> |
| </execution> |
| </executions> |
| </plugin> |
| </plugins> |
| </build> |
| [...] |
| </project> |
| +---+ |
| |
| There are different situations within a multi module build which can lead to problems |
| (for example not working with maven-release-plugin etc.). |
| This rule is intended to prevent such problems. |
| |
| Let us assume we have the following (simple) project structure for a multi module setup. |
| |
| +----- |
| root (pom.xml) |
| +--- module1 (pom.xml) |
| +--- module2 (pom.xml) |
| +----- |
| |
| The root <<pom.xml>> looks like this: |
| |
| +----- |
| <groupId>com.mycompany.project</groupId> |
| <artifactId>parent</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| (..) |
| +----- |
| |
| The best practice in Maven is that all childs inherit the version from their parent |
| and don't define a new version which looks like this: |
| |
| +----- |
| <parent> |
| <groupId>...</groupId> |
| <artifactId>...</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| </parent> |
| |
| <artifactId>module1</artifactId> |
| (..) |
| +----- |
| |
| But sometimes people mistaken things or violate the best-practice which |
| looks like this: |
| |
| +----- |
| <parent> |
| <groupId>...</groupId> |
| <artifactId>...</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| </parent> |
| |
| <artifactId>module1</artifactId> |
| <version>1.1-SNAPSHOT</version> |
| +----- |
| |
| By using this rule you would get a message during the build |
| with the following resulting output: |
| |
| +----- |
| [WARNING] Rule 0: org.apache.maven.plugins.enforcer.ReactorModuleConvergence failed with message: |
| The reactor contains different versions. |
| --> com.mycompany.project:myproject:pom:1.1-SNAPSHOT |
| +----- |
| |
| The next which happens is that the parent in a reactor is sometimes |
| the wrong one like the following situation: |
| |
| +----- |
| <parent> |
| <groupId>...</groupId> |
| <artifactId>...</artifactId> |
| <version>1.1-SNAPSHOT</version> |
| </parent> |
| |
| <artifactId>module1</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| (..) |
| +----- |
| |
| This will prompted by the following message: |
| |
| +----- |
| [WARNING] Rule 0: org.apache.maven.plugins.enforcer.ReactorModuleConvergence failed with message: |
| Reactor modules have parents which contain a wrong version. |
| --> com.mycompany.project:myproject:pom:1.1-SNAPSHOT parent:com.mycompany.project:myproject:pom:1.0-SNAPSHOT |
| +----- |
| |
| If you have only changed a parent by accident with the wrong version |
| like this: |
| |
| +----- |
| <parent> |
| <groupId>...</groupId> |
| <artifactId>...</artifactId> |
| <version>1.1-SNAPSHOT</version> |
| </parent> |
| |
| <artifactId>module1</artifactId> |
| (..) |
| +----- |
| |
| you will get the same message as above: |
| |
| +----- |
| [WARNING] Rule 0: org.apache.maven.plugins.enforcer.ReactorModuleConvergence failed with message: |
| The reactor contains different versions. |
| --> com.mycompany.project:myproject:pom:1.1-SNAPSHOT |
| +----- |
| |
| An other things which happens that simply the parent will be forgotten which |
| produces a message like this: |
| |
| +---- |
| [WARNING] Rule 0: org.apache.maven.plugins.enforcer.ReactorModuleConvergence failed with message: |
| Reactor contains modules without parents. |
| module: com.mycompany.project:myproject:pom:1.2-SNAPSHOT |
| +---- |
| |
| In larger mutli-module builds it happens also that the defined parent is given |
| but does not belong to the reactor like this: |
| |
| +----- |
| <parent> |
| <groupId>org.apache.enforcer</groupId> |
| <artifactId>something-different</artifactId> |
| <version>1.1</version> |
| </parent> |
| |
| <artifactId>module1</artifactId> |
| (..) |
| +----- |
| |
| Usually already the Maven warning like this should be paid attention to: |
| |
| +----- |
| [WARNING] |
| [WARNING] Some problems were encountered while building the effective model for org.apache.enforcer:pom:1.0.4-SNAPSHOT |
| [WARNING] 'parent.relativePath' points at org.apache.enforcer:something-different instead of org.apache.enforcer:something-different, please verify your project structure @ line 7, column 11 |
| [WARNING] |
| +----- |
| |
| but this will oversight often. So the enforcer rule will break simply |
| such mail formed build via the message (This required that the parent |
| has the same version as the rest of the build which happens): |
| |
| +----- |
| [WARNING] Rule 0: org.apache.maven.plugins.enforcer.ReactorModuleConvergence failed with message: |
| Module parents have been found which could not be found in the reactor. |
| module: org.apache.enforcer:something-different:pom:1.0.4-SNAPSHOT |
| +----- |
| |
| |
| An other case which happens (for example by merging from a branch into trunk/master) |
| is that an intermodule dependency contains the wrong version like this: |
| |
| +----- |
| <parent> |
| <groupId>...</groupId> |
| <artifactId>...</artifactId> |
| <version>1.2-SNAPSHOT</version> |
| </parent> |
| |
| <artifactId>module1</artifactId> |
| |
| <dependencies> |
| <dependency> |
| <groupId>com.mycompany.project</groupId> |
| <artifactId>myproject</artifactId> |
| <version>1.1</version> |
| </dependency> |
| (..) |
| </dependencies> |
| (..) |
| +----- |
| |
| This will result in the following message: |
| |
| +----- |
| [WARNING] Rule 0: org.apache.maven.plugins.enforcer.ReactorModuleConvergence failed with message: |
| Reactor modules contains dependencies which do not reference the reactor. |
| module: com.mycompany.project:myproject-x:jar:1.2-SNAPSHOT |
| dependency: com.mycompany.project:myproject:1.1 |
| +----- |