You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何扩展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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:34:27