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的配置,如下:
这里写图片描述

这里写图片描述

解析插件版本

这里写图片描述

解析插件前缀

这里写图片描述

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机qq音乐听不了歌怎么办 第一试用网密码忘了怎么办 玩h1z1画面卡顿怎么办 uu跑腿抢不到单怎么办 比特币加密忘了怎么办 路虎发现cd卡死怎么办 苹果手机帐号被锁定怎么办 苹果手机帐号锁定了怎么办 微博帐号被锁定怎么办 微博显示帐号被锁定怎么办 uc屏蔽了一个网站怎么办 uu跑腿送货遇到不方便收货怎么办 雷神加速器忘记暂停怎么办 obs直播开摄像头吃鸡掉帧怎么办 陌陌收到的礼物怎么办 吃了油腻的东西恶心怎么办 主播工资不发怎么办 主播工资被欠怎么办 直播平台不发工资坑主播怎么办 主播公司不发工资怎么办 梦幻月卡用完了怎么办 网易星球实名认证通过不了怎么办 认证过荔枝主播怎么办 苹果手机相机不对焦怎么办 苹果手机摄像头不能对焦了怎么办 闪电邮里面邮件太多怎么办 苹果手机和助理打不开怎么办 苹果我的世界打不开怎么办 ps试用7天到期了怎么办 皮肤锁不住水份怎么办 硫酸弄到皮肤上怎么办 直播时图像反看怎么办 快手直播权限被收回怎么办 快手直播权限被收回了怎么办 腾讯手游助手玩游戏卡怎么办 电脑直播视频打不开了怎么办 平板进水开不了机怎么办 苹果平板进水开不了机怎么办 苹果平板电脑进水了怎么办 电脑换主机以前的文件怎么办 货车卖了没过户怎么办