maven学习(五)插件和自定义插件
插件是可以配置在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学习(五)插件和自定义插件的更多相关文章
- 浅析MyBatis(三):聊一聊MyBatis的实用插件与自定义插件
在前面的文章中,笔者详细介绍了 MyBatis 框架的底层框架与运行流程,并且在理解运行流程的基础上手写了一个自己的 MyBatis 框架.看完前两篇文章后,相信读者对 MyBatis 的偏底层原理和 ...
- 五、xadmin自定义插件2
以导入插件为例说明: 1.在xadmin-->plugins下面新建excel.py文件 2.新建ListExcelImportPlugin类,继承BaseAdminPlugin from xa ...
- 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 ...
- Maven学习 五 Maven项目创建(1)jar项目
第一步:Maven项目的创建 File->new->Maven project. 点击下一步 上方的两个多选框选上,第一个是不使用archetype 原型模板,第二个是使用默认工作空间 点 ...
- Maven学习 (五) Elipse中发布一个Maven项目到Tomcat
对于maven初学者的我,经常遇到一个问题就是,maven项目创建成功后,本来已经添加了jar的依赖,但是发布到Tomcat中就是没有jar包存在, 启动Tomcat总是报没有找到jar包,可项目结构 ...
- Maven学习(五)-----如何从Maven远程存储库下载?
如何从Maven远程存储库下载? 根据 Apache Maven 的说明: Downloading in Maven is triggered by a project declaring a dep ...
- 深入学习jQuery自定义插件
原文地址:jQuery自定义插件学习 1.定义插件的方法 对象级别的插件扩展,即为jQuery类的实例增加方法, 调用:$(选择器).函数名(参数); $(‘#id’).myPlugin(o ...
- jQuery自定义插件--banner图滚动
前言 jQuery是一个功能强大的库,提供了开发JavaScript项目所需的所有核心函数.很多时候我们使用jQuery的原因就是因为其使用插件的功能,然而,有时候我们还是需要使用自定义代码来扩展这些 ...
- Cordova与现有框架的结合,Cordova插件使用教程,Cordova自定义插件,框架集成Cordova,将Cordova集成到现有框架中
一.框架集成cordova 将cordova集成到现有框架中 一般cordova工程是通过CMD命令来创建一个工程并添加Android.ios等平台,这样的创建方式可以完整的下载开发过程中所需要的的插 ...
随机推荐
- Linux 未安装vi如何编辑文件
sed -i "s/搜索内容/替换内容/g" 文件名
- vue的props和$emit / 父子组件通信
props 父级: 父级组件中引用子组件,并将自己data下面的giveChild数据绑定在 giveChildData 传给子 <myChild :giveChildData=" ...
- [转] docker基础知识之挂载本地目录
[From] https://blog.csdn.net/huludan/article/details/52641090 https://my.oschina.net/piorcn/blog/324 ...
- SQL注入(过滤空格和--+等注释符)
1.地址:http://ctf5.shiyanbar.com/web/index_2.php(过滤了空格和--+等注释符) 思路:确定注入参数值类型,直接输入单引号,根据报错信息确定参数值类型为字符型 ...
- <a>标签深入讲解
标签中 href 和 onclick 的区别,以及href="javascript:xxx(this);"与onclick="xxx(this);" 传递thi ...
- 使用jenkins自动化构建android和ios应用
背景 随着业务需求的演进,工程的复杂度会逐渐增加,自动化的践行日益强烈.事实上,工程的自动化一直是我们努力的目标,能有效提高我们的生产效率,最大化减少人为出错的概率,实现一些复杂的业务需求应变.场景如 ...
- oracle 日志文件
--Oracel Grid 11.2的Agent有多个,其中有两个最重要:orarootagent.oraagent --它们有各自的日志文件,这些Agent的日志文件位于: $grid_home/l ...
- UnityError The same field name is serialized multiple times in the class or its parent class. This is not supported: Base(MonoBehaviour) i
相同的字段名在类或其父类中被多次序列化.这是不支持的, 这里指的是 变量i . 写如下两个脚本挂到新项目的相机上运行就会出现这个问题: public class Father : MonoBehavi ...
- 如何发布一个包到npm && 如何使用自己发布的npm包 && 如何更新发布到npm的package && 如何更新当前项目的包?
如何发布一个包到npm First 在https://www.npmjs.com注册一个账号. Second 编辑好项目,文件大致如下: 其中,gitignore可以如下: .DS_Store nod ...
- TOJ 2861 Octal Fractions
描述 Fractions in octal (base 8) notation can be expressed exactly in decimal notation. For example, 0 ...