目录
本文概览:介绍maven生命周期和插件。
1 生命周期
1.1 生命周期介绍
maven是一个项目构建(build)工具。对于一个项目包含清理、编译、测试、打包、发布包、部署等工作,maven把这些工作抽象成一个项目的生命周期,即mavn的生命周期。可以在不使用maven的情况下,实现项目的清理、编译、测试、打包等项目相关操作,可以更好理解maven功能。参考 java自带项目管理命令 。
Maven提供了三个独立的生命周期clean、default、site:
- clean生命周期:负责清理项目
- default生命周期:负责构建项目
- site生命周期:负责建立项目站点。
1.2 生命周期的阶段
三个生命周期是独立的互不影响的。如下命令格式:对于T1Pn表示clean周期某一个阶段,T2Pm表示default周期某一个阶段,T3Pr表示Site周期某一个阶段。当执行T1Pn时,clean周期中Pn阶段之前的所有阶段都要执行。
1 |
MVN [T1Pn] [T2Pm] [T3Pr] |
每个生命周期都包含多个阶段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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<build> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>attach-sources</id> <phase>verify</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> </build> |
3、插件的配置属性
根据作用域包括三种属性:命令行、全局范围、某一个插件目标范围。
(1)命令行
通过-D来指定
mvn install -Dmaven.test.skip=true
(2)全局
该插件下所有插件目标公用这个属性。如下通过<plugin>下的<configuration>来计息配置
1 2 3 4 5 6 7 8 9 10 |
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <configuration> <encoding>utf8</encoding> <source>1.5</source> <target>1.5</target> </configuration> </plugin> |
(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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> ... <!-- 全局 --> <build>...</build> <!-- profile --> <profiles> <profile> <!-- "Profile Build" contains elements of the BaseBuild set only --> <build>...</build> </profile> </profiles> </project> |
1.4.1 包含元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<build> <finalName>xxxx</finalName> <filters> <filter>conf/app-config.properties.dev</filter> </filters> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <resources> <resource> <directory>src/main/profiles/${deploy.type}</directory> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> </build> |
1、fileName,最终生成产出的名字。比如项目jar、源码jar、asembly生成的包的名字。没有这个配置会使用<artifactId>的配置。
1 |
<finalName>xxxx</finalName> |
2、<filters>
3、<resources>
当需要加载src/jaca/resources目录以外目录时,如在指定不同profIle,加载不同目录下文件时,在resource如下设置,需要引入deploy/conf目录下的文件,即src/main/resources以外的文件,此时需要引入resources插件,否则会有问题。
1 2 3 4 5 6 7 8 9 10 11 |
<build> <resources> <resource> <directory>deploy/conf/${deploy.type}</directory> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> </build> |
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、配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.2</version> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptors> <descriptor>src/main/assembly/package.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> |
3、package.xml
在<configuration>中配置了这个xml的路径。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> <id>package</id> <formats> <format>tar.gz</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <fileSets> <fileSet> <directory>deploy/bin</directory> <outputDirectory>/bin</outputDirectory> </fileSet> </fileSets> <dependencySets> <dependencySet> <outputDirectory>/lib</outputDirectory> <useProjectArtifact>true</useProjectArtifact> <unpack>false</unpack> <scope>runtime</scope> </dependencySet> </dependencySets> </assembly> |
(1)formats
指定打包类型。支持打包格式有 zip、tar、tar.gz、jar、war,可以同时指定多个打包格式
1 2 3 |
<formats> <format>tar.gz</format> </formats> |
(2)<filesets>和<fileSet>
<fileSet> 标识打包生成的一个文件目录,需要生成多个目录,就定义多个<fileset>
- directory表示项目中路径
- outputDirecotry指定打包时生成的目录
- include指定要包含的文件,可以定义多个<include>。如使用** 表示全部文件,使用*.jar只包含jar,test.jar表示只加载test.jar。
1 2 3 4 5 6 7 8 9 |
<filesets> <fileSet> <directory>deploy/bin</directory> <outputDirectory>/bin</outputDirectory> <includes> <include>**</include> </includes> </fileSet> </filesets> |
1 2 3 4 5 |
<dependencySets> <dependencySet> <outputDirectory>/lib</outputDirectory> </dependencySet> </dependencySets> |
如果想要排除项目jar,则需要设置
1 |
<useProjectArtifact>false</useProjectArtifact> |
(4)<includeBaseDirectory> 是否包含打包层的目录。假设一个test.jar,如果为true,此时解压,会在当前目录建立一个test目录;如果为fase,就直接解压内容到当前目录
(5)<files>和<file>
fileSet都是针对项目中文件加,file 可以指定具体的文件,如下:
1 2 3 4 5 6 |
<files> <file> <source>input.txt</source> <outputDirectory>/</outputDirectory> </file> </files> |
2.3 spring-boot-maven-plugin
spring-boot-maven-plugin作用于一个Spring boot应用,生成一个jar包,解压这个jar之后,包含BOOT-INF、META-INF、org三个目录。
- classes 如果项目的class文件。
- lib,依赖的第三方jar。
对于spring boot的工程都需要如下打包插件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> |
参数解释
- 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下面是项目代码。
对应的pom.xml文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<build> <finalName>app</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.5.7.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <finalName>app</finalName> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptors> <descriptor>${descriptor.file}</descriptor> </descriptors> </configuration> </execution> </executions> </plugin> </build> |
对应assembly的配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> <id>online</id> <formats> <format>dir</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <fileSets> <fileSet> <directory>./deploy</directory> <outputDirectory>./</outputDirectory> <includes> <include>run.sh</include> <include>startup.sh</include> <include>stop.sh</include> </includes> </fileSet> <fileSet> <directory>./target</directory> <outputDirectory>./</outputDirectory> <includes> <include>*.jar</include> </includes> </fileSet> </fileSets> </assembly> |
执行mvn package命令时,首先执行spring-boot-maven-plugin在target目录下生产app.jar,然后执行maven-assembly-plugin 生成一个文件目录app。targe目录下的内容如下:
3 其他插件
3.1 源码插件
这个插件会对项目的源码进行打包生成jar。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.2.1</version> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> |
参考
1、 maven官网 插件 http://maven.apache.org/plugins/index.html