能否结合maven-tiles使用maven-enforcer-plugin的RequirePluginVersions规则?
核心问题:maven-enforcer-plugin的RequirePluginVersions规则仅会遍历父POM链,不会识别通过maven-tiles插件动态注入的POM片段(比如你的payload-tile里定义的pluginManagement)。从调试日志里的plugin org.apache.maven.plugins:maven-source-plugin not found就能确认这一点——虽然该插件版本已经被tile正确注入,但enforcer没去解析tiles的配置。
下面是几种可行的解决方式:
方案1:调整执行阶段与tiles应用顺序
步骤1:修改enforcer的执行阶段
在enforcer-tile中,把enforcer的执行阶段从verify提前到initialize,确保所有tiles的POM片段都已经注入完成后再执行检查:
<execution> <id>enforce-plugin-version-management</id> <phase>initialize</phase> <!-- 替换原有的verify阶段 --> <goals> <goal>enforce</goal> </goals> <configuration> <fail>true</fail> <rules> <requireMavenVersion><version>3.6.3</version></requireMavenVersion> <requirePluginVersions> <message>Best Practice is to always define plugin versions!</message> <phases>clean,verify,deploy,site</phases> </requirePluginVersions> </rules> </configuration> </execution>
步骤2:调整tiles的应用顺序
去掉子POM中的<applyBefore>配置,让tiles在父POM之后应用,确保tile里的pluginManagement能正确合并到项目的有效POM中:
<configuration> <!-- 移除 <applyBefore>com.my.company:missing_warning_root_pom</applyBefore> --> <buildSmells>dependencymanagement</buildSmells> <tiles> <tile>com.my.company:regular_case-tile:1.0.0</tile> <tile>com.my.company:enforcer-tile:1.0.0</tile> </tiles> <filtering>true</filtering> </configuration>
方案2:利用tiles内置的版本检查机制
tiles-maven-plugin自带pluginversions嗅探器,能自动检查所有插件是否在pluginManagement中定义了版本,而且它天然支持识别tiles中的配置。只需在子POM的tiles配置中添加该嗅探器:
<configuration> <buildSmells>dependencymanagement,pluginversions</buildSmells> <tiles> <tile>com.my.company:regular_case-tile:1.0.0</tile> <tile>com.my.company:enforcer-tile:1.0.0</tile> </tiles> <filtering>true</filtering> </configuration>
这个方案无需依赖enforcer,完全利用tiles的特性,更适配你的架构。
方案3:自定义Enforcer规则(进阶)
如果必须保留enforcer的检查逻辑,可以自定义一个Enforcer规则,让它读取项目的有效POM(包含tiles注入的所有内容)来检查插件版本。需要编写Java代码继承AbstractEnforcerRule,在规则中通过Maven API获取完整的有效POM,遍历其中的插件配置进行版本检查。
内容的提问来源于stack exchange,提问作者leuchtstoffratte

