Maven的插件
来源:互联网 发布:淘宝满减后再退货 编辑:程序博客网 时间:2024/05/20 05:59
插件目标
Maven的核心仅仅定义了抽象的生命周期,具体的任务是交由插件完成的,插件以独立的构建形式存在,因此,Maven核心的分发包不到3MB的大小,Maven会在需要的时候下载并使用插件。
对于插件本身,为了能够复用代码,他往往能完成多个任务。例如maven-dependency-plugin,他能够基于项目依赖做很多事情。能够分析项目依赖,找出潜在的无用依赖,列出依赖树,帮助分析依赖来源等等。这些功能都聚集在一个插件里,每一个功能就是一个插件的目标。
maven-dependency-plugin有十多个目标,每个目标对应一个功能,上述的功能对应插件的目标为:dependency:analyze、dependency:tree和dependency-list。这是一种通常的写法,冒号前面是插件前缀,冒号后面是插件的目标。
插件绑定
Maven的生命周期与插件项目绑定,用以完成实际的构建任务。具体来说,是生命周期的阶段与插件的目标相互绑定,以来完成某个具体的构建任务。例如项目编译这一任务,他对应了default生命周期的compile这一阶段,而maven-compiler-plugin这一插件的compile目标能够完成该任务。因此,将他们绑定,就能够实现项目编译的目的。如图所示。
内置绑定
为了能让用户几乎不用任何配置就能够构建Maven项目,Maven在核心为一些主要的生命周期阶段绑定了很多插件目标(很多的功能),当用户通过命令行调用生命周期阶段的时候,对应的插件目标就会执行相应的任务。
clean生命周期仅有pre-clean、clean和post-clean三个阶段,其中的clean与maven-clean-plugin:clean绑定。maven-clean-plugin仅有clean这一个目标,其作用就是删除项目的输出目录。clean生命周期阶段与插件目标的绑定关系如下所示:
site生命周期有pre-site、site、post-site和site-deploy四个阶段。其中,site和maven-site-plugin:site项目绑定,site-deploy和maven-site-plugin:depoy相互绑定。maven-site-plugin有很多目标,其中,site目标用来生成项目站点,deploy目标用来将项目站点部署到远程服务器。site生命周期阶段与插件目标的绑定关系如下:
相对于clean和site生命周期来说,default生命周期与插件目标的绑定关系就显得复杂一些。这是因为对于任何项目来说,例如jar项目和war项目,他们的项目清理和站点生成的任务是一样的,不过构建过程会有区别。例如jar项目需要打包成JAR包,而war项目需要打包成WAR包。
由于项目的打包类型会影响构建的具体过程,因此,default生命周期的阶段与插件的目标的绑定关系由项目打包类型所决定,打包类型使用过POM中packaging元素定义的。最常见是打包为jar,也是默认打包类型。基于该打包类型的项目,其default生命周期的内置插件绑定关系及具体任务如下:
上图只是列出了拥有插件绑定关系的阶段,default生命周期还有很多其他阶段,默认他们没有绑定任何插件,因此也没有任何实际行为。
自定义绑定
除了内置绑定之外,用户还能够自己选择将某个插件目标绑定到生命周期的某个阶段上,这种自定义绑定方式能够让Maven项目在构建过程中执行更多更丰富特色的任务。
一个常见的例子就是创建项目的源码jar包,内置的插件绑定关系中并没有涉及这一任务,因此需要用户自行配置。maven-source-plugin可以帮助我们完成该任务,他的jar-no-fork目标能够将项目的主代码打包成jar包,可以将其绑定到default生命周期的verify阶段上,在执行完集成测试后和安装构件之前创建源码jar包。下面是具体的配置
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.1.1</version> <executions> <execution> <id>attach-sources</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
在POM的build元素下的plugins子元素中声明插件的使用,该例子中使用到的是maven-source-plugin,其中groupId为org.apache.maven.plugins,这也是Maven官方插件的groupId,紧接着是artifactId为maven-source-plugin,version为2.1.1。对于自定义绑定的插件,用户总是应该声明一个非快照版本,这样可以避免由于插件版本变化造成构建的不稳定性。
上述配置中,除了基本的插件坐标声明之外,还有插件执行配置,executions下每个execution子元素可以用来配置执行一个任务。该例中配置一个id为attach-sources的任务,通过phase配置,将其绑定到verify生命周期阶段上,再通过goals配置指定执行的插件目标。至此,自定义插件绑定完成。运行mvn verify就可以看到结果,
注意:有很多插件的目标在编写的时候已经定义了默认的绑定阶段。所以上述配置,在删除phase一行之后,执行mvn verify还是能看到结果。
当插件目标被绑定到不同的生命周期阶段的时候,其执行顺序会由生命周期阶段的先后顺序决定。如果多个目标被绑定到同一个阶段,这些插件声明的先后顺序决定了目标执行的顺序。
插件配置
完成了插件和生命周期的绑定之后,用户还可以配置插件目标的参数,进一步调整插件目标所执行的任务,以满足项目的需求。几乎所有的maven插件的目标都有一些可配置的参数,用户通过命令行和POM配置等方式来配置这些参数。
命令行插件配置
用户可以再Maven命令中使用-D
参数,并伴随一个参数键=参数值的形式,来配置插件目标的参数。
例如,maven-surefire-plugin提供了一个maven.test.skip参数,当其值为true的时候,就会跳过执行测试,于是在运行命令的时候,加上如下-D参数就能跳过测试:
$mvn install -Dmaven.test.skip=true
POM中插件全局配置
并不是所有的插件参数都适合从命令行配置,有些参数从项目创建到发布根本不会发生改变,对于这情况,在POM文件中配置会更好,避免重复输入。
例如,我们通常会需要配置maven-compiler-plugin告诉他编译java1.5版本的源文件,生成与JVM1.5兼容的字节码文件,如下
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.1</version> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build>
这样不管是绑定到compile阶段的maven-compiler-plugin:compile任务,还是绑定到test-compiler阶段的maven-compiler-plugin:testCompiler任务,就都能够使用该配置,基于java1.5版本进行编译。
POM中插件任务配置
除了为插件配置全局的参数,用户还可以为某个插件任务配置特定的参数。以maven-antrun-plugin为例子,他有一个目标run,可以用来在Maven中调用Ant任务。用户将maven-antrun-plugin:run绑定到多个生命周期阶段上,再加以不用的配置,就可以让Maven在不用的生命阶段执行不同的任务。
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.3</version> <executions> <execution> <id>ant-validate</id> <phase>validate</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <echo>I'm bound to validate phase.</echo> </tasks> </configuration> </execution> <execution> <id>ant-verify</id> <phase>verify</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <echo>I'm bound to verify phase.</echo> </tasks> </configuration> </execution> </executions> </plugin> </plugins> </build>
在上述代码片段中,首先,maven-antrun-plugin:run与validate阶段绑定,从而构成了一个id为ant-validate的任务。插件全局配置中的configuration元素位于plugin元素下面,而这里的configuration元素则位于execution元素下,表示这是特定任务的配置,而非插件整体的配置。这个ant-validate任务配置了一个echo Ant任务,向命令行输出一段文字,表示该任务是绑定到validate阶段的。第二个任务的id为ant-verify,它绑定到了verify阶段,同样它也输出一段文字到命令行,告诉该任务绑定到了verify阶段。
获取插件信息
在线插件信息
使用maven-help-plugin描述插件
从命令行调用插件
如果在命令行运行mvn-h来显示mvn命令帮助,就能看到如下信息:
这个信息告诉我们mvn命令的基本用法,options表示可用的选项。除了选项之外,mvn命令后面可以调价一个或者多个goal和phase,他们分别用来指插件目标和生命周期阶段。
Maven引入了目标前缀的改变,上图中help是maven-help-plugin的目标前缀,dependency是maven-dependency-plugin的前缀,有了插件前缀,Maven就能够找到对应的artifactId。不过,处理artifactId,Maven还需要得到groupId和version才能精确定位到某个插件。
插件解析机制
插件仓库
不过,Maven会区别对待依赖的远程仓库与插件的远程仓库。党Maven需要的依赖在本地仓库不存在,她会去所配置的远程仓库查找,可是当Maven需要的插件在本地仓库不存在的时候,他就不会去这些远程仓库查找。
不同于repositories及其repository子元素,插件的远程仓库使用pluginRepositories和pluginRepository配置,Maven内置了如下的插件远程仓库配置。
插件的默认groupId
在POM中配置插件的时候,如果该插件是Maven官方插件(即如果groupId为org.apache.maven.plugins),就可以省略groupId的配置,如下:
解析插件版本
解析插件前缀
- Maven的几个插件
- Maven插件的安装
- maven插件的jdk
- maven依赖的插件
- maven的resources插件
- maven的插件
- maven的插件
- 常用的maven插件
- Maven插件的编写
- maven的插件配置
- maven的打包插件
- Maven的插件
- Eclipse插件对于Maven Maven的功能
- Maven的tomcat插件tomcat-maven-plugin
- 再续maven 编写自己的maven插件
- maven以及maven插件的安装
- maven插件maven-dependency-plugin的使用
- maven的maven-resource-plugin资源插件
- Python输入输出
- 机器学习(2)朴素贝叶斯Naive Bayesian 应用举例
- ini文件读取类
- Camera app 分析(三)拍照流程
- Android 中 弹出 Dialog 后监听 Back键 点击事件
- Maven的插件
- QT5.4 read access violation at: 0x0, flags=0x0 (first chance)
- 字符串中获取网站地址(网站匹配)源码
- 数据库中用户登录注册用户信息表怎么设计如何设计
- MySQL创建计算字段.md
- Android常用开源框架
- 深入理解HTTP协议
- 关于Mybatis关闭一级二级缓存
- 理论---Quartz