背景:
项目中使用了一些内部的二方包,有些是公共的工具类封装,有些是一些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,猜测是处于安全的考虑。