本文概览:介绍maven生命周期和插件。

1 生命周期

1.1 生命周期介绍

maven是一个项目构建(build)工具。对于一个项目包含清理、编译、测试、打包、发布包、部署等工作,maven把这些工作抽象成一个项目的生命周期,即mavn的生命周期。可以在不使用maven的情况下,实现项目的清理、编译、测试、打包等项目相关操作,可以更好理解maven功能。参考 java自带项目管理命令 。

Maven提供了三个独立的生命周期clean、default、site:

  • clean生命周期:负责清理项目
  • default生命周期:负责构建项目
  • site生命周期:负责建立项目站点。

38173473

 

1.2 生命周期的阶段

三个生命周期是独立的互不影响的。如下命令格式:对于T1Pn表示clean周期某一个阶段,T2Pm表示default周期某一个阶段,T3Pr表示Site周期某一个阶段。当执行T1Pn时,clean周期中Pn阶段之前的所有阶段都要执行。

每个生命周期都包含多个阶段Phrase,每一个阶段都由对应的插件实现,即生命周期每一个阶段和插件的目标相绑定。

1.2.1 插件介绍

1、插件目标

插件中提供多个功能,每一个功能是插件的一个目标。通过<goal></goal>指定。

2、插件和生命周期的绑定

包括内置和自定义绑定两种。

(1)内置绑定关系

默认将插件目标和mvn生命周期的阶段绑定关系。 对于内置的插件,有时候还重新引入,比如compler重新引入是为了设置jdk版本属性。

(2)自定义绑定

将生成源码jar绑定到verify生命周期中。如下,通过插件<maven-resources-plugin>的jar-no-frok插件目标来实现生成源码jar。通过<phase>来绑定生命周期,如果没有使用<phase>,则使用插件默认指定的生命周期的阶段phase。

3、插件的配置属性

根据作用域包括三种属性:命令行、全局范围、某一个插件目标范围。

(1)命令行

通过-D来指定

mvn install -Dmaven.test.skip=true

(2)全局

该插件下所有插件目标公用这个属性。如下通过<plugin>下的<configuration>来计息配置

(3)某一个插件目标范围。

在<plugin>的<executions>的<execution>的<configuration>中进行设置该插件目标的配置信息。

1.2.2 生命周期阶段和插件映射

如下:( 可以参考maven官网 插件  http://maven.apache.org/plugins/index.html

(1)clean

阶段 描述 绑定插件的目标
pre-clean
clean 清空target目录

mvn-clean-plugin:clean

post-clean

(2)default

阶段 描述 绑定插件
validate
initialize
generate-sources
process-sources

处理项目的资源文件,把src/main/resources目录下的文件复制输出到classpatch中

process-sources
generate-resources
process-resources

复制主资源文件至主输出目录

mvn-resource-plugin:resources

compile

编译项目代码,生成class文件放到lclasspath目录

mvn-compiler-plugin:compile

process-class
generate-test-sources

process-test-sources

处理项目的测试资源文件,把src/main/resources目录下的文件复制输出到classpatch中

generate-test-resources

process-test-resources

test

使用单元测试框架运行测试,测试代码不会被打包或部署。把class放到测试环境的classpath目录

mvn-surefire-puligin:test

prepare-package

package

打包生成jar,放到target目录

mvn-jar-plugin:jar

pre-integration-test

 integration-test

post-integration-test

verify
install 发布到本地仓库

mvn-install-plugin:install

deploy 发布到远程仓库

mvn-deploy-plugin:deploy

package阶段是  执行打包,并且把依赖的包下载到本地目录,是否maven的依赖都会下载到本地工程目录进行打包?包含三种情况:

  • 默认只对项目生成一个jar,没有第三方依赖
  • 通过assembly插件生成一个tar.gz,包含 项目jar和第三方jar。
  • 将项目class和第三方jar组成一个 jar文件,使用spring-boot-maven-plugin:repackage。

(3)site

阶段 描述 绑定插件
pre-site
sit 生成项目站点
post-site
sit-deploy 将生成项目站点发布到服务器

1.3 mvn命令与生命周期的阶段映射

mvn 的命令对应生命周期的阶段,如mvn  package,就是对应default生命周期的package阶段,由上面表可以知道是对应插件mvn-jar-plugin的jar目标。

1.4 生命周期与maven配置<build>

maven生命周期通过插件实现,每个阶段都由一个插件来完成;每一个生命周期都有默认自带的插件。需要新增插件时,可以在<build>中增加(build语义:构建项目)。

在Maven的pom.xml文件中,存在如下两种<build>:

(1)全局配置(project build)

         针对整个项目的所有情况都有效

(2)配置(profile build)

           针对不同的profile配置

1.4.1 包含元素

1、fileName,最终生成产出的名字。比如项目jar、源码jar、asembly生成的包的名字。没有这个配置会使用<artifactId>的配置。

2、<filters>

Maven的环境配置

3、<resources>

当需要加载src/jaca/resources目录以外目录时,如在指定不同profIle,加载不同目录下文件时,在resource如下设置,需要引入deploy/conf目录下的文件,即src/main/resources以外的文件,此时需要引入resources插件,否则会有问题。

4、<plugin>

表示一个插件。

2 打包插件

2.1 maven-jar-plugin 生成jar文件

生成jar。java项目都是通过这个 插件生成jar。

2.2 maven-assembly-plugin 归档jar文件

1、插件作用

maven-jar-plugin为内置打包插件,生成jar。

maven-assembly-plugin,是在内置插件生成jar之后,对项目jar和依赖第三方的jar进行归档。

2、配置

3、package.xml

在<configuration>中配置了这个xml的路径。

(1)formats

指定打包类型。支持打包格式有 zip、tar、tar.gz、jar、war,可以同时指定多个打包格式

(2)<filesets>和<fileSet>

<fileSet> 标识打包生成的一个文件目录,需要生成多个目录,就定义多个<fileset>

  • directory表示项目中路径
  • outputDirecotry指定打包时生成的目录
  • include指定要包含的文件,可以定义多个<include>。如使用** 表示全部文件,使用*.jar只包含jar,test.jar表示只加载test.jar。

(3)<dependencySets>和<dependencySet>
来配置归类项目jar 和 依赖第三方的jar的存储目录名。如下项目所有的jar放置在lib目录下面

如果想要排除项目jar,则需要设置

(4)<includeBaseDirectory> 是否包含打包层的目录。假设一个test.jar,如果为true,此时解压,会在当前目录建立一个test目录;如果为fase,就直接解压内容到当前目录

(5)<files>和<file>

fileSet都是针对项目中文件加,file 可以指定具体的文件,如下:

 2.3 spring-boot-maven-plugin

spring-boot-maven-plugin作用于一个Spring boot应用,生成一个jar包,解压这个jar之后,包含BOOT-INF、META-INF、org三个目录。

45278695

  • classes  如果项目的class文件。
  • lib,依赖的第三方jar。

对于spring boot的工程都需要如下打包插件:

参数解释

  • repackage。插件默认的目标,表示在maven-jar-plugin生成jar之后再重新生成一个jar,覆盖原来生成的jar。

1、spring-boot-maven-plugin 与  maven-assembly-plugin 的区别,在项目引用了两个,分别作用是什么?有的项目只用了spring-boot-maven-plugin也没有问题。

(1)执行顺序

一般在pom.xml中,assembly定义在spring-boot-maven-plugin之后,这样maven在执行package阶段时会按照声明顺序处理,先执执行spring-boot-maven-plugin,再执行assembly

(2)assemble作用

在项目中我们会写一些启动脚本。通过spring-boot-maven-plugin生成jar并没有包含这些脚本,通过  maven-assembly-plugin 可以将spring-boot-maven-plugin生成jar 和 启动脚本 组合成一个新的jar或者一个简单目录

如下一个项目,deploy目录下有stop.sh、startup.sh和run.sh三个脚本,main下面是项目代码。

48302624

对应的pom.xml文件:

对应assembly的配置文件如下:

执行mvn package命令时,首先执行spring-boot-maven-plugin在target目录下生产app.jar,然后执行maven-assembly-plugin 生成一个文件目录app。targe目录下的内容如下:

48002190

3 其他插件

3.1 源码插件

这个插件会对项目的源码进行打包生成jar。

参考

1、 maven官网 插件  http://maven.apache.org/plugins/index.html

 

 

分类&标签