插件是可以配置在settings.xml和pom.xml中的

插件目标

  在了解插件和生命周期的绑定关系之前,先来说一下插件目标。在实际项目构建的过程中,需要经历编译、打包等等许许多多的操作,为每个操作都单独定义一个插件是不可取的,因为有很多可以复用的代码。所以一个插件往往有许多个目标,每个目标完成一个具体的操作。比如denpendency:tree中,dependency指的是插件前缀,tree指的就是插件目标。

默认绑定:maven生命周期的阶段与插件的目标是相互绑定的,比如maven-compile-plugin插件默认绑定maven defalut生命周期的compile阶段。

内置绑定(生命周期和插件的绑定关系):

  clean生命周期:

生命周期阶段 插件目标
pre-clean  
clean maven-clean-plugin:clean
post-clean  

  site生命周期:

生命周期阶段 插件目标
pre-site  
site maven-site-plugin:site
post-site  
site-deploy

maven-site-plugin:deploy

  default生命周期:

生命周期阶段 插件目标 执行任务
process-resources maven-resources-plugin:resources 复制主资源文件至主输出目录
compile maven-compiler-plugin:compile 编译主代码至输出目录
process-test-resources maven-resources-plugin:testResources 复制测试资源文件至测试输出目录
test-compile maven-compiler-plugin:testCompile 编译测试代码至测试输出目录
test maven-surefire-plugin:test 执行测试用例
package maven-jar-plugin:jar 创建项目jar包
install maven-install-plugin:install 将项目输出构件安装到本地仓库
deploy maven-deploy-plugin:deploy

将项目输出构件安装到远程仓库

自定义绑定(配置插件和maven生命周期的目标绑定):直接看例子吧~

pom.xml配置:

      

执行:

    

输出:

    

源码包:

    

比对:

    

插件获取来源:

  官网:http://maven.apache.org/plugins/index.html

  1.Apache:https://repo.maven.apache.org/maven2/org/apache/maven/plugins/。一般maven-*-plugin的都是maven官网的plugin,引用插件时可以忽略groupId的书写。

  2.codehaus.org

  3.code.google.com

 插件的使用:

  这里再次强调一下在"maven常用命令"中提到过的"mvn help:describe 参数(如-Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1)"。当我们遇到某个不了解的插件,但是想要去使用时,可以借助这个命令来查看。这个命令的原理实际是调取了maven-help-plugin这个描述插件

  命令行调取插件格式:mvn [options] [goal(s)] [phase(s)],其中options可以在命令行中使用mvn -h查看和学习,goals指定插件的目标 phase指定在某个特定的生命周期的某个阶段执行。

插件仓库和解析机制:

  在settings.xml中配置<pluginRepsitories>元素即可。默认也是会从maven的中央仓库来下载(id=central)

  默认的groupId有两个org.apache.maven.plugin、org.codehaus.mojo,对应<pluginGroups>元素(顾名思义,可以配置多个)。

settings.xml配置:

<pluginGroups>
<!-- 官方插件,为了确保稳定不支持快照版 -->
<pluginGroup>org.apache.maven.plugins</pluginGroup>
<!-- 另一个插件网站,被墙了进不去 -->
<pluginGroup>org.codehaus.mojo</pluginGroup>
<!-- 自己的插件地址 -->
   <pluginGroup>com.your.plugins</pluginGroup>
</pluginGroups>

    maven超级pom中默认的插件配置:

 解析机制:

  groupId:settings.xml => <pluginGroups>

  artifactId:pom.xml中某插件的<artifactId>

  1.通过groupId + artifactId定位到元数据关系文件 =>maven-metadata-xxx.xml

      

  2.关系文件中定义了插件的名称、前缀、组件id

  

  3.maven会优先基于默认的groupId归并插件仓库的元数据,并进行查找,找不到就找<pluginGroups>中定义的下一个,都没有就报错。

 自定义插件:(待补充...)

  条件:

    <packaging>元素值必须为:maven-plugin

    <dependency>元素必须依赖maven-plugin-api插件

    必须继承AbatractMojo类并实现execute()

    必须使用@goal注解声明插件的目标

  注解:

    @goal <name>                          唯一必须声明的标注,描述插件的目标名称

    @phase <name>                         执行插件的生命周期

    @requiresDependencyResolution <scope>            运行mojo前必须解析所有指定范围的依赖,compile、test、runtime,默认为runtime

    @requiresProject <true/false>                 是否必须在一个maven项目中运行,默认为true。

    @requireDirectInvocation <true/false>            是否只能使用命令行调用,默认为false

    @requiresOnline <true/false>                  是否必须maven在线,默认false

    @requiresReport <true/false>                 是否要求项目报告已经生成,默认为false  

    @aggregator                           mojo在多模块运行时,是否只在顶层模块运行

    @execute goal = "<goal>"                    运行该目标前,是否先运行另一个mojo目标

    @execute phase = "<phase>"                   运行该目标前,是否先让maven运行一个并行的生命周期,到指定阶段为止

    @execute lifecycle = "<lifecycle>" phase="<phase>"     运行该目标前,让maven先运行一个自定义的生命周期,到指定阶段为止

    @parameter alias = "<aliasName>"               为入参设置别名

    @parameter expression = "${aSystemProperty}"        使用系统参数为入参赋值

    @parameter default-value = "aValue/${anExpression}"     使用固定值或表达式设置一个默认值

    @readonly                             只读参数,无法设置

    @required                             必须参数,没有默认值也不传就会报错

  错误日志:AbstractMojo提供一个getLog()方法,入参支持四种级别的日志方法:debug、info、warn、error。

maven学习(五)插件和自定义插件的更多相关文章

  1. 浅析MyBatis(三):聊一聊MyBatis的实用插件与自定义插件

    在前面的文章中,笔者详细介绍了 MyBatis 框架的底层框架与运行流程,并且在理解运行流程的基础上手写了一个自己的 MyBatis 框架.看完前两篇文章后,相信读者对 MyBatis 的偏底层原理和 ...

  2. 五、xadmin自定义插件2

    以导入插件为例说明: 1.在xadmin-->plugins下面新建excel.py文件 2.新建ListExcelImportPlugin类,继承BaseAdminPlugin from xa ...

  3. Vue学习之--------Vue中自定义插件(2022/8/1)

    文章目录 1.插件的基本介绍 2.实际应用 2.1 目录结构 2.2 代码实例 2.2.1 学校组件(School.vue) 2.2.2 学生组件(Student.vue) 2.2.3 定义的插件 2 ...

  4. Maven学习 五 Maven项目创建(1)jar项目

    第一步:Maven项目的创建 File->new->Maven project. 点击下一步 上方的两个多选框选上,第一个是不使用archetype 原型模板,第二个是使用默认工作空间 点 ...

  5. Maven学习 (五) Elipse中发布一个Maven项目到Tomcat

    对于maven初学者的我,经常遇到一个问题就是,maven项目创建成功后,本来已经添加了jar的依赖,但是发布到Tomcat中就是没有jar包存在, 启动Tomcat总是报没有找到jar包,可项目结构 ...

  6. Maven学习(五)-----如何从Maven远程存储库下载?

    如何从Maven远程存储库下载? 根据 Apache Maven 的说明: Downloading in Maven is triggered by a project declaring a dep ...

  7. 深入学习jQuery自定义插件

    原文地址:jQuery自定义插件学习 1.定义插件的方法 对象级别的插件扩展,即为jQuery类的实例增加方法, 调用:$(选择器).函数名(参数);      $(‘#id’).myPlugin(o ...

  8. jQuery自定义插件--banner图滚动

    前言 jQuery是一个功能强大的库,提供了开发JavaScript项目所需的所有核心函数.很多时候我们使用jQuery的原因就是因为其使用插件的功能,然而,有时候我们还是需要使用自定义代码来扩展这些 ...

  9. Cordova与现有框架的结合,Cordova插件使用教程,Cordova自定义插件,框架集成Cordova,将Cordova集成到现有框架中

    一.框架集成cordova 将cordova集成到现有框架中 一般cordova工程是通过CMD命令来创建一个工程并添加Android.ios等平台,这样的创建方式可以完整的下载开发过程中所需要的的插 ...

随机推荐

  1. Python闭包需要注意的问题

    定义   python中的闭包从表现形式上定义为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure),也就是说内层函数引用了外层函数 ...

  2. POJ_2456 Aggressive cows 【二分求最大化最小值】

    题目: Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are l ...

  3. 带OUTPUT的增删改

    sql server2005以后引入: 执行的sql语句中加入output可以事实输出处理的内容 go --插入并返回每行的插入值 DECLARE @NewRows TABLE(Id INT ,NAM ...

  4. my31_MGR单写模式压测以及对比普通从库记录

    场景MGR单写模式三节点,db46写节点,db47/db48为读节点工具sysbencn.压测15个小时,db46上18线程纯写,12线程oltp混合测试,db48上12线程select在压测2个小时 ...

  5. java se系列(三) 顺序语句、if...else、switch、While、do-while、for、break、continue

    1 顺序语句 语句:使用分号分隔的代码称作为一个语句. 注意:没有写任何代码只是一个分号的时候,也是一条语句,称作空语句. 顺序语句就是按照从上往下的顺序执行的语句. 2 判断(if…else) 什么 ...

  6. python查看模块版本及所在文件夹

    # 以Numpy为例 第一种方法:import numpy as np np.__version__ >>> '1.12.1' np.__file__ >>> '/ ...

  7. flex buider 4.6 打开设计模式(designer)时提示内存不足错误的解决办法

    先申明,此方法只适用于flex builder 4.6及以下版本, flex builder 4.7以后已经完全取消了designer功能,是没有办法补救的. 1. 首先下载APE文件,这个文件好像是 ...

  8. 深入redis内部之redis启动过程之一

    redis作为一个服务器,它的启动是从main函数开始的.redis.c 1. 进程重命名 #ifdef INIT_SETPROCTITLE_REPLACEMENT spt_init(argc, ar ...

  9. [SDOI2013]刺客信条

    Description 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一名刺客.最终,凭借着他的努力和出众的天赋,成为了杰出的刺 ...

  10. 修改ThinkPHP的验证码类

    今天用ThinkPHP重新开发一个系统,用到了ThinkPHP的验证码类,由于我希望验证码别太复杂,希望验证码里边只有数字,却发现该Verify类并未提供设置验证码中使用的字符的配置的方法,于是查看源 ...