maven第三方plugin加载原理

不管是自己编写的plugin插件,还是springboot等开源机构提供的插件,都属于自定义的第三方plugin。

这两天学习springboot的时候,关于maven有一些疑问。

一个工程,如果pom中未指定plugin包含spring-boot-maven-plugin,那么使用mvn spring-boot:repackage等命令进行打包的时候,不会去下载spring-boot-maven-plugin.jar文件,会提示找不到plugin即如下错误:

[ERROR] No plugin found for prefix 'spring-boot' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (/Users/gaozengrong/repository), tbmirror (http://mvnrepo.alibaba-inc.com/mvn/repository), tbmirror-snapshots (http://mvnrepo.alibaba-inc.com/mvn/repository)

如果一个工程的pom中指定plugin包含spring-boot-maven-plugin,这时使用相应的命令时,会去远程maven仓库下载spring-boot-maven-plugin.jar(如果本地仓库中没有的话)。

我们知道,调用自定义的plugin时一般是通过mvn groupId:artifactId:version:goal这种固定格式来进行调用,例如我们调用spring-boot-maven-plugin的某个goal,命令为
mvn org.springframework.boot:spring-boot-maven-plugin:1.5.2.RELEASE:start,如果我们要通过别名来进行调用,比如mvn idea:clean命令,那么我们就必须在maven的settings.xml文件中的pluginGroups标签下加入我们自定义的plugin的groupId

<pluginGroups>  
       <pluginGroup>org.springframework.boot</pluginGroup>  
</pluginGroups>

(原因:默认情况下Maven只会在org.apache.maven.plugins和org.codehaus.mojo两个groupId下搜索插件,所以我们要将插件的groupId放在Maven默认的插件搜寻范围之内。)

但是实际情况下,我们没有在settings.xml文件中加入spring-boot-maven-plugin的groupId,那么我们是如何通过别名来运行mvn spring-boot:repackage等命令的呢?
我们从仓库下载并解压spring-boot-maven-plugin-1.5.2.RELEASE.jar文件,找到它的pom文件(本质上spring-boot-maven-plugin也是一个maven工程),发现pom中指定了属性<goalPrefix>spring-boot</goalPrefix>,既然指定了前缀,那么肯定可以通过mvn spring-boot来进行调用了。

    原文作者:上课睡觉觉
    原文地址: https://www.jianshu.com/p/601a5aa2daab
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞