maven 插件开发

来源:互联网 发布:数据分析技术 编辑:程序博客网 时间:2024/06/02 04:57

背景:

项目中使用了一些内部的二方包,有些是公共的工具类封装,有些是一些client的api。在开发的时候通常使用的是SNAPSHOT 版本,在正式发布的时候通常需要使用正式版本,但是这个很容易忽视,导致下一次发布的时候可能因为版本的原因导致线上出错。所以这里开发一个maven插件,在打包的时候可以检验依赖树中内部二方包是否使用了SNAPSHOT版本。


插件开发:

maven插件相关的资料网上都有,不过基本都是最简单的打个hello world。基本就是能帮你搭个环境,其他的就指望不上了。根据上面的背景需求,最重要的是能够获取到当前项目的依赖树。通过注入MavenProject 可以方便的获取相应的依赖,核心代码如下

/**     * The Maven project to analyze.     *     * @parameter expression="${project}"     * @required     */    private MavenProject project;    /**     * 当前环境     *     * @parameter expression="${envirment}"     * @required     */    String envirment;    @Override    public void execute() throws MojoExecutionException, MojoFailureException {        getLog().info("--------------------        ╮(╯▽╰)╭        ------------------------");        getLog().info("------------------------------------------------------------------------");        getLog().info("---------------------     AEGIS CHECKERS START     --------------------------");        if (!StringUtils.equals(envirment, PRODUCT) && !StringUtils.equals(envirment, PREP)) {            getLog().info("---------------------  current envirment is not product or prep     --------------------------");        } else { //只校验正式 和预发环境            List<Dependency> dependencyList = project.getDependencies();            List<Dependency> hasSnapDependencyList = new ArrayList<>();            for (Dependency dependency : dependencyList) {                if (dependency.getGroupId().contains(YANGT) && dependency.getVersion().contains(SNAPSHOT)) {                    hasSnapDependencyList.add(dependency);                }            }            if (!hasSnapDependencyList.isEmpty()) {                getLog().error("---------------------    AEGIS CHECKERS FAILED     --------------------------");                StringBuilder sb = new StringBuilder();                for (Dependency dependency : hasSnapDependencyList) {                    sb.append(dependency.getGroupId() + ":" + dependency.getArtifactId() + ":" + dependency.getVersion() + ";");                }                getLog().error("the following dependency version is SNAPSHOT:" + sb.toString());                throw new MojoFailureException("dependency check fail");            }        }        getLog().info("---------------------     AEGIS CHECKERS END     --------------------------");    }


最后需要注意的是:如果需要发布到远程nexus,需要使用正式版本。如果使用snapshot,会找不到相应的依赖,实际上本地能下载到jar包,但是maven就报找不到plugin,猜测是处于安全的考虑。



0 0