此规则检查反应器内的版本是否一致,此外它将检查项目中的每个模块是否包含父级,并且父级是否是反应器构建的一部分。此外,将检查依赖项是否是模块间依赖项,它们使用与反应器给出的相同版本。
此规则支持以下参数:
注意:当前状态无法正确处理mvn -pl subproject validate之类的情况。这将在下一个主要版本 (2.X) 的强制执行器中得到正确处理。
示例插件配置:
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0</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>
多模块构建中有不同的情况可能导致问题(例如不使用 maven-release-plugin 等)。该规则旨在防止此类问题。
让我们假设我们有以下(简单)项目结构用于多模块设置。
root (pom.xml)
+--- module1 (pom.xml)
+--- module2 (pom.xml)
根pom.xml如下所示:
<groupId>com.mycompany.project</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> (..)
Maven 中的最佳实践是所有子级都从其父级继承版本,并且不定义如下所示的新版本:
<parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>module1</artifactId>
(..)
但有时人们会犯错或违反最佳实践,如下所示:
<parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>module1</artifactId>
<version>1.1-SNAPSHOT</version>
通过使用此规则,您将在构建期间收到一条消息,其中包含以下结果输出:
[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
接下来发生的情况是反应器中的父级有时是错误的,例如以下情况:
<parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>1.1-SNAPSHOT</version>
</parent>
<artifactId>module1</artifactId>
<version>1.0-SNAPSHOT</version>
(..)
这将由以下消息提示:
[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
如果您只是偶然使用错误的版本更改了父母,如下所示:
<parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>1.1-SNAPSHOT</version>
</parent>
<artifactId>module1</artifactId>
(..)
您将收到与上述相同的消息:
[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
发生的其他事情只是父母会被遗忘,这会产生如下消息:
[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
在较大的多模块构建中,也发生了定义的父级,但不属于这样的反应器:
<parent>
<groupId>org.apache.enforcer</groupId>
<artifactId>something-different</artifactId>
<version>1.1</version>
</parent>
<artifactId>module1</artifactId>
(..)
通常已经有这样的Maven警告应该注意了:
[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]
但这会经常疏忽。因此,执行者规则将通过消息简单地破坏此类邮件形成的构建(这要求父级具有与发生的其余构建相同的版本):
[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
发生的另一种情况(例如,通过从分支合并到主干/主控)是模块间依赖项包含错误的版本,如下所示:
<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>
(..)
这将导致以下消息:
[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