blob: c2947f7292ba9cf34bec4c01767c22eebbb255d2 [file] [log] [blame]
~~ 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 multi-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
+-----