Maven专题3——生命周期与插件

三套生命周期

Maven有3套相互独立生命周期,用户可以调用某个生命周期的阶段,而不会对其他生命周期产生影响。

每个生命周期包含一些有先后顺序的阶段,后面的阶段依赖于前面的阶段,意味着用户调用后面的生命周期阶段时,同一生命周期中前面的阶段也将被执行。

clean生命周期

  1. pre-clean
  2. clean
  3. post-clean

default生命周期

  1. validate
  2. initialize
  3. generate-sources
  4. process-sources
  5. generate-resources
  6. process-resources
  7. compile
  8. process-classes
  9. generate-test-sources
  10. process-test-sources
  11. generate-test-resources
  12. process-test-resources
  13. test-compile
  14. process-test-classes
  15. test
  16. prepare-package
  17. package
  18. pre-integration-test
  19. integration-test
  20. post-integration-test
  21. verify
  22. install
  23. deploy

site生命周期

  1. pre-site
  2. site
  3. post-site
  4. site-deploy

命令行与生命周期

mvn clean调用clean生命周期的clean阶段;

mvn test调用default生命周期的test阶段

插件目标

Maven核心仅定义了抽象的生命周期,而具体的任务是交由具体的插件完成的。

每个目标通常对应了一个功能,插件目标常见的写法如:

dependency:tree

compiler:compile

surefire:test

冒号前面是插件前缀,冒号后面是插件目标

插件绑定

Maven通过将生命周期的具体阶段与插件的目标绑定,完成具体的构建任务。

内置绑定关系

Maven核心为一些主要的生命阶段内置绑定了一些插件的目标,这就是为什么我们可以执行很多mvn命令而无需指定具体的插件。

  • 下表中的default生命周期以packaging元素为jar类型为例:
生命周期 阶段 插件目标
clean clean maven-clean-plugin:clean
site site maven-site-plugin:site
site site-deploy maven-site-plugin:deploy
default process-resources maven-resources-plugin:resources
default compile maven-compiler-plugin:compile
default process-test-resources maven-resources-plugin:test-resources
default test-compile maven-compiler-plugin:test-compile
default test maven-surefire-plugin:test
default package maven-jar-plugin:jar
default install maven-install-plugin:install
default deploy maven-deploy-plugin:deploy

因此我们在执行上述声明周期阶段时,缺省地就会执行相应插件的对应目标。

自定义绑定

build.plugins.plugin元素中,通过executions.execution元素进行一个自定义绑定:

示例:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>x.y.z</version>
            <executions>
                <execution>
                    <id>attach-sources</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>jar-no-fork</goal>
                    </goals>
                </execution>
            </executions>
        <plugin>
    </plugins>
</build>

其中:

  • 每个execution元素配置执行一个任务,
  • id元素表示创建一个构建任务,给任务指定一个名称
  • phase元素将该任务绑定到具体的生命周期阶段,如上例中的default生命周期的verify阶段。下文将介绍该元素何时是可选的。
  • goals元素配置在该阶段要执行的插件目标,如上例中的jar-no-fork

插件的默认绑定

很多插件在实现时,默认进行了绑定,通过maven-help-plugin插件可以查看:

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:x.y.z -Ddetail

其中jar-no-fork目标相关的部分描述如下:

source:jar-no-fork
  Description: This goal bundles all the sources into a jar archive. This
    goal functions the same as the jar goal but does not fork the build and is
    suitable for attaching to the build lifecycle.
  Implementation: org.apache.maven.plugin.source.SourceJarNoForkMojo
  Language: java
  Bound to phase: package

该命令会显示指定插件的所有目标和具体的绑定。每个目标中的Bound to phase就是该插件目标的默认绑定

有了默认绑定,在自定义插件的绑定时,如果不指定phase元素,就会在默认绑定的阶段执行对应的目标。

插件配置

命令行配置

一些插件的目标参数支持命令行配置:

mvn clean install -Dmaven.test.skip=true

maven-surefire-plugin提供了maven.test.skip参数,-D是Java自带的,用来通过命令行设置Java系统属性,Maven重用了该参数,可以用来配置插件的参数。

POM配置

POM中配置插件通过在插件配置中增加configuration元素实现,该配置是对插件进行的全局配置,与命令行参数只对具体构建任务有效不同。

示例:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>x.y.z</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        <plugin>
    </plugins>
</build>

也可以给具体的插件目标进行配置,具体是在execution元素中添加configuration元素,此时只对具体的插件目标生效。

获取插件信息

maven-help-plugin插件

使用目标前缀描述插件,如下,compilermaven-compiler-plugin的目标前缀:

mvn help:describe -Dplugin=compiler

如果想查看具体目标的描述:

mvn help:describe -Dplugin=compiler -Dgoal=compile

如果想查看更详细的描述,可以加上-Ddetail参数。

插件参数与用户属性

通过help插件可以描述插件的详细信息,详细信息中包含了插件的参数。

surefire:test
  Description: Run tests using Surefire.
  Implementation: org.apache.maven.plugin.surefire.SurefirePlugin
  Language: java
  Bound to phase: test

  Available parameters:
...

skip (Default: false)
      User property: maven.test.skip
      Set this to 'true' to bypass unit tests entirely. Its use is NOT
      RECOMMENDED, especially if you enable it using the 'maven.test.skip'
      property, because maven.test.skip disables both running the tests and
      compiling the tests. Consider using the skipTests parameter instead.
...

如该例中的skip参数,用来跳过测试。然而实际在命令行中使用时,需要关注的是User property属性,其中指定了用户实际使用时的键。

不是每个参数都有User property属性,此时这些插件参数只能通过POM进行配置。

在线插件介绍

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

http://mojo.codehause.org/plugins.html

插件前缀

有的插件目标与具体的生命周期阶段绑定,通过命令行mvn命令激活具体的生命周期阶段,即可执行绑定的插件目标。

有些插件目标并不适合绑定于具体的生命周期,Maven还支持直接从命令行调用插件命令:

mvn help:describe -Dplugin=compiler

mvn dependency:tree

它们分别对应了:

mvn org.apache.maven.plugins:maven-help-plugin:2.1:describe -Dplugin=compiler

mvn org.apache.maven.plugins:maven-dependency-plugin:2.1:tree

这里就引出了插件前缀这个概念,

helpmaven-help-plugin的前缀,dependencymaven-dependency-plugin的前缀。

插件前缀与groupId:artifactId是一一对应的,这种对应关系存储在仓库元数据中

http://repo1.maven.org/maven2/org/apache/maven/plugins

http://repository.codehaus.org/org/codehaus/mojo

下的maven-metadata.xml中, 列出了各个已定义的插件与前缀对应关系,这样,我们在命令行中就可以使用插件前缀来指代具体的插件了。

插件默认的groupId

对于Maven官方插件(groupIdorg.apache.maven.plugins),在POM中进行配置时可以省略groupId这一行的配置。

插件版本的解析

Maven在超级POM中为所有核心插件设定了版本,超级POM是所有Maven项目的父POM,所有项目都继承这个超级父POM的配置。

因此,即使用户不加任何配置,核心插件的版本也已经确定了。

如果用户使用某个插件时没有指定版本,而这个插件又不属于核心插件范畴,Maven会去检查所有仓库中可用的版本并作出选择。

Maven 3在没有声明插件的版本时,使用稳定的发行版而不是快照版,相对于Maven 2更加稳定。

推荐在使用Maven插件时显式指定插件版本,避免不同构建时间存在使用不同的插件而带来构建不一致的问题。

原文地址:https://www.cnblogs.com/zyon/p/11294238.html

时间: 2024-11-08 00:09:20

Maven专题3——生命周期与插件的相关文章

项目构建之maven篇:6.生命周期与插件

项目生命周期 清理 初始化 编译 测试 打包 部署 三套生命周期 1.clean pre-clean 执行一些需要在clean之前完成的工作 clean 移除所有上一次构建生成的文件 post-clean 执行一些需要在clean之后立刻完成的工作 2.compile validate generate-sources process-sources generate-resources process-resources 复制并处理资源文件,至目标目录,准备打包. compile 编译项目的源

Maven整理笔记の生命周期和插件

项目构建的生命周期,其实软件开发人员每天都在干这个事,即项目清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等,可以说几乎所有项目的构建都可以映射到这样一个生命周期上. Maven的插件机制是完全依赖Maven的生命周期的. 三套生命周期 Maven的生命周期并不是一个整体,Maven拥有三套独立的生命周期,它们分别是clean\default\site.Clean生命周期的目的是清理项目,default生命周期的目的是构建项目,而site的生命周期的目的是建立项目站点. 每个生命

Maven核心概念之仓库,生命周期与插件

宏观图 一.仓库 统一存储全部Maven项目共享的构建的位置就是仓库. 仓库分为本地仓库和远程仓库.远程仓库又分为中央仓库(中央仓库是Maven核心自带的远程仓库),伺服(还有一种特殊的远程仓库,为节省宽带和时间,在局域网内架设的一个私有的仓库server,用其代理全部的外部的远程仓库.内部项目也能部署到伺服上),其它公开的远程仓库(常见的由Java.net Maven库,Jboss Maven库). Maven依据坐标寻找构件的时候,它首先会查看本地仓库,假设本地仓库存在此构件,则直接使用:假

Maven系列学习(三)Maven生命周期和插件

Maven生命周期和插件 Maven另外的两个核心概念就是生命周期和插件,Maven的生命周期都是抽象的,其实实际行为都是由插件来完成的,生命周期和插件两者协同工作 1.生命周期 Maven的生命周期就是为了对所有的构建过程进行抽象和统一,这个生命周期包含了项目的清理,初始化,编译,测试,打包,集成测试,验证,部署和站点生成等几乎所有构建步骤,Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在Maven的设计中,实际的任务都是交给插件来完成的 一次构建(build):ini

maven详解之生命周期与插件(一)

Maven是一个优秀的项目管理工具,它能够帮你管理编译.报告.文档等. Maven的生命周期: maven的生命周期是抽象的,它本身并不做任何的工作.实际的工作都交由"插件"来完成. maven的每个构建步骤都可以绑定一个或多个插件行为,而且maven为大多数的构建步骤编写并绑定了默认插件. 三套生命周期: clean.default.site clean: 主要目的是清理项目 pre-clean: 执行一些清理前需要完成的工作 clean: 清理上一次构建生成的文件 post-cle

Maven生命周期(插件)

maven拥有三套相互独立的生命周期,它们分别是clean,default和site.clean生命周期的目的是清理项目,default生命周期的目的是构建项目,而site 生命周期的目的是建立项目站点. 命令行与生命周期:从命令行执行maven任务的最主要方式就是调用maven的生命周期阶段. mvn clean:该命令调用clean生命周期的clean阶段.实际执行的阶段为clean生命周期的pre-clean和clean阶段. maven的生命周期与插件相互绑定,用以完成实际的构件任务.具

Maven学习笔记(六):生命周期与插件

何为生命周期: Maven的生命周期就是为了对所有的构建过程进行抽象和统一.Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完善的.易扩展的生命周期.这个生命周期包含了项目的清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等几乎所有构建步骤.也就是说,几乎所有项目的构建,都能映射到这样一个生命周期上. Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在Maven的设计中,实际的任务(如编译源代码)都交由插件来完成.这种思想与设计模式中的模板方法(

maven的仓库、生命周期与插件

一.仓库 统一存储所有Maven项目共享的构建的位置就是仓库. 仓库分为本地仓库和远程仓库.远程仓库又分为中央仓库(中央仓库是Maven核心自带的远程仓库),伺服(另一种特殊的远程仓库,为节省宽带和时间,在局域网内架设的一个私有的仓库服务器,用其代理所有的外部的远程仓库,内部项目也能部署到伺服上),其他公开的远程仓库(常见的由Java.NET Maven库,Jboss Maven库). Maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在此构件,则直接使用:如果本地仓库不存在

Maven入门教程三----生命周期和插件

生命周期和插件   Maven定义了三套生命周期:clean.default.site,每个生命周期都包含了一些阶段(phase). 三套生命周期相互独立,但各个生命周期中的phase却是有顺序的,且后面的phase依赖于前面的phase. 执行某个phase时,其前面的phase会依顺序执行,但不会触发另外两套生命周期中的任何phase. 如下图: -------------------------------------------------------------------------