如何扩展Maven Enforcer自定义规则以校验依赖版本的master-前缀
完善Maven Enforcer自定义规则:禁止项目及依赖版本以"master-"开头
我来帮你完善这个自定义规则,让它同时检查项目版本和所有依赖的版本是否以master-开头。核心思路是从MavenProject对象中获取所有已解析的依赖,逐个检查版本号即可。
修改后的完整代码
package com.gridpoint.energy.customRule; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.enforcer.rule.api.EnforcerRule; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; import org.apache.maven.execution.MavenSession; import org.apache.maven.execution.RuntimeInformation; import org.apache.maven.plugin.logging.Log; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; import org.codehaus.plexus.component.repository.exception.ComponentLookupException; /** * Custom rules to enforce for maven dependencies */ public class CustomRule implements EnforcerRule { /** * Simple param. This rule will fail if the value is true. */ private boolean shouldIfail = false; public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException { Log log = helper.getLog(); try { // 获取Maven项目对象 MavenProject project = (MavenProject) helper.evaluate("${project}"); String version = (String) helper.evaluate("${project.version}"); // 1. 检查项目自身版本 if (version != null && version.startsWith("master-")) { log.warn("项目版本以master-开头: " + version); this.shouldIfail = true; } // 2. 检查所有已解析的依赖版本(包括传递性依赖) for (Artifact artifact : project.getArtifacts()) { String depVersion = artifact.getVersion(); if (depVersion != null && depVersion.startsWith("master-")) { log.warn("发现违规依赖版本: " + artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + depVersion); this.shouldIfail = true; } } // 以下是你原有的日志和组件获取代码,可按需保留 MavenSession session = (MavenSession) helper.evaluate("${session}"); String target = (String) helper.evaluate("${project.build.directory}"); String artifactId = (String) helper.evaluate("${project.artifactId}"); ArtifactResolver resolver = (ArtifactResolver) helper.getComponent(ArtifactResolver.class); RuntimeInformation rti = (RuntimeInformation) helper.getComponent(RuntimeInformation.class); log.info("Retrieved Target Folder: " + target); log.info("Retrieved ArtifactId: " + artifactId); log.info("Retrieved Project: " + project); log.info("Retrieved RuntimeInfo: " + rti); log.info("Retrieved Session: " + session); log.info("Retrieved Resolver: " + resolver); // 如果发现违规,抛出异常中断构建 if (this.shouldIfail) { throw new EnforcerRuleException("检测到项目或依赖版本以master-开头,构建终止。"); } } catch (ComponentLookupException e) { throw new EnforcerRuleException("Unable to lookup a component " + e.getLocalizedMessage(), e); } catch (ExpressionEvaluationException e) { throw new EnforcerRuleException("Unable to lookup an expression " + e.getLocalizedMessage(), e); } } public String getCacheId() { return "" + this.shouldIfail; } public boolean isCacheable() { return false; } public boolean isResultValid(EnforcerRule arg0) { return false; } }
关键修改说明
- 导入必要类:新增
import org.apache.maven.artifact.Artifact;,因为我们要处理依赖的Artifact对象 - 项目版本检查优化:用
startsWith("master-")替代原有的子串截取判断,代码更简洁易读 - 依赖版本检查逻辑:
- 通过
project.getArtifacts()获取所有已解析的依赖(包括直接依赖和传递性依赖) - 遍历每个Artifact,获取其实际版本号并检查是否以
master-开头 - 记录警告日志,方便快速定位违规的依赖
- 通过
- 异常信息优化:自定义了更清晰的错误提示,帮助开发者快速理解构建失败原因
可选调整
如果你只想检查直接依赖而不是传递性依赖,可以把遍历project.getArtifacts()改成遍历project.getDependencies(),代码如下:
for (Dependency dependency : project.getDependencies()) { String depVersion = dependency.getVersion(); if (depVersion != null && depVersion.startsWith("master-")) { log.warn("发现直接依赖版本违规: " + dependency.getGroupId() + ":" + dependency.getArtifactId() + ":" + depVersion); this.shouldIfail = true; } }
注意这种方式需要导入org.apache.maven.model.Dependency类。
内容的提问来源于stack exchange,提问作者sjain
相关产品推荐
相关产品推荐

