如何理解maven插件, maven lifeCycle和plugin的关系
pom文件定义了一个maven项目的maven配置,一般pom文件的放在项目或者模块的根目录下。
pom文件构成(主要)
根元素和必要配置
<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
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,也是打包成jar包路径的依据 -->
<!-- 例如com.companyname.project-group,maven打包jar包的路径:/com/companyname/project-group -->
<groupId>com.companyname.project-group</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>project</artifactId>
<!-- 项目当前版本,格式为:主版本.次版本.增量版本-限定版本号 -->
<version>1.0</version>
<!--项目产生的构件类型,包括jar、war、ear、pom等 -->
<packaging>jar</packaging>
</project>
工程师
父项目和parent元素
<!--父项目的坐标,坐标包括group ID,artifact ID和version。 -->
<!--如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值 -->
<parent>
<!--被继承的父项目的构件标识符 -->
<artifactId>com.companyname.project-group</artifactId>
<!--被继承的父项目的全球唯一标识符 -->
<groupId>base-project</groupId>
<!--被继承的父项目的版本 -->
<version>1.0.1-RELEASE</version>
<!-- 父项目的pom.xml文件的相对路径,默认值是../pom.xml。 -->
<!-- 寻找父项目的pom:构建当前项目的地方--)relativePath指定的位置--)本地仓库--)远程仓库 -->
<relativePath>../pom.xml</relativePath>
</parent>
项目依赖相关信息
dependencyManagement来声明依赖,通过dependencies元素来管理依赖。
1、依赖坐标 2、依赖类型 3、依赖传递 4、依赖范围
项目构建需要的信息
build标签定义了构建项目需要的信息
路径管理
<sourceDirectory />
<testSourceDirectory />
<outputDirectory />
<testOutputDirectory />
<scriptSourceDirectory />
sourceDirectory:项目源码目录,构建系统会编译目录里的源码, 定义的是相对于pom文件的相对路径;
testSourceDirectory:项目单元测试源码目录,定义的也是是相对于pom文件的相对路径;
outputDirectory:被编译过的应用程序class文件存放的目录,也是是相对于pom文件的相对路径;
testOutoutDIrectory:被编译过的测试class文件存放的目录,也是是相对于pom文件的相对路径;
scriptSourceDirectory:项目脚本源码目录,也是是相对于pom文件的相对路径。由于脚本是解释性的语言,所以该目录下的内容,会直接被拷贝到输出目录,而不需要编译。
maven 特点1: (在遵循约定大于配置原则下,不需要配置)
资源管理
<resources>
<resource>
<targetPath />
<directory />
<includes />
<excludes />
</resource>
</resources>
<testResources>
<testResource>
<targetPath />
<directory />
<includes />
<excludes />
</testResource>
<testResources>
<resources> <testResources> 描述了项目相关 测试相关的所有资源路径,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。
targetPath:描述了资源的目标输出路径,该路径是相对于target/classes的路径; 如果是想要把资源直接放在target/classes下,不需要配置该元素
directory:描述打包前的资源的存放路径,这个路径是相对于pom文件所在目录的相对路径;
includes:包含的模式列表,例如**/*.xml。只有符合条件的资源文件才会在打包的时候被放入到输出路径中;
excludes:排除的模式列表,例如**/*.xml,符合的资源文件不会在打包的时候会被过滤掉。
插件管理
作用: 编译代码,创建jar文件,创建war文件,创建项目文档等。
1. 插件管理相关的元素有两个,包括pluginManagement和plugins。
-
怎么理解插件
maven 特点2 :Maven本质上是一个空空的插件框架,不具备执行具体任务的能力,所有这些任务都交给插件来完成。 进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标。
像编译是通过
maven-compile-plugin
实现的、测试是通过maven-surefire-plugin
实现的,maven也内置了很多插件,所以我们在项目进行编译、测试、打包的过程是没有感觉到。
一个插件通常提供了一组目标,可使用以下语法来执行:
mvn [plugin-name]:[goal-name]
该命令的意思是:执行“plugin-name”插件的“goal-name”目标(或者称为动作)
例如:一个 Java 项目可以使用 Maven 编译器插件来编译目标,通过运行以下命令编译
`mvn compiler:compile' 编译位于src/main/java/目录下的主源码
`mvn compiler:testCompile' 编译位于src/test/java/目录下的测试源码
- maven 插件列表
- https://maven.apache.org/plugins/index.html 最成熟的插件
- http://mojo.codehaus.org/plugins.html。
lifeCycle生命周期和插件的关系?
1. maven项目生命周期和阶段
http://maven.apache.org/ref/3.5.0/maven-core/lifecycles.html
- Maven 把构建项目的过程,总体分为三个生命周期(lifecycle):
1、默认构建:default
2、项目清理:clean
3、项目建站:site - 每个生命周期又由许多阶段(phase)组成。
-
**每个阶段,都可以指定默认执行的目标(goal),去具体执行某项工作。**
举例说明:
1、默认构建:default,分为以下阶段:
1)validate
2)compile
3)test
4)package
5)verify
6)install
7)deploy
这些阶段是有顺序的,构建时按序逐一执行。
在命令行中 使用阶段 来执行构建。只需输入阶段名称即可。
Maven会按顺序执行该阶段之前的所有阶段。
例如:
mvn install
mvn clean package
问题: 前面说maven本身是不执行任何具体任务的,都是通过插件执行, 通过 阶段 构建时,是怎么指定 调用那个插件的呢?
2. 阶段被绑定了默认的执行插件及目标
https://maven.apache.org/ref/3.5.0/maven-core/default-bindings.html
构建阶段的默认执行插件及目标是通过 packaging 的类型指定的。
package 类型 jar war pom 等 . packaging 的类型中定义了一系列的阶段,及每个阶段要执行哪个插件的哪个目标。
拿 jar 举例(jar 是 maven 默认的 packaging 类型,packaging 未指定时就是 jar 类型),
如果 packaging 类型是 jar,则其相应的 maven 各个阶段所对应的插件的默认执行的目标如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jFjSnKGa-1643511228386)(D:\Typora笔记2\分享\3_补充maven.assets\image-20220126163541139.png)]
所以当指定了 packaging 的类型时,可以直接调用阶段的名称来执行 Maven 构建。
3. 修改构建阶段默认执行的插件及目标
拿 compiler 核心插件举例。该插件有两个目标:compile,testCompile
前者编译 main 目录下的源码
后者编译 test 目录下的源码
packaging 为 jar 时,它在 compile 阶段只绑定了 compiler 插件的 compile 目标。
即:compile 阶段不执行 testCompile 目标。
我们可以在 compile 阶段,把 testCompile 目标也添加进来:
<build>
<finalName>test</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<executions>
<execution>
<configuration>
<target>1.7</target>
<source>1.7</source>
</configuration>
<phase>compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
总结
maven特点 3:
Maven 是基于插件的项目 maven构建过程是基于阶段的构建的
- 构建阶段和插件是相互独立的
- 构建阶段的默认执行插件及目标是通过 packaging 的类型指定的。
Assembly.xml maven 定制化打包
plugin 标签的配置项
<!-- 可使用的插件列表 -->
<plugins>
<!--plugin元素包含描述插件所需要的信息。 -->
<plugin>
<!--插件定位坐标三元素:groupId + artifactId + version -->
<groupId />
<artifactId />
<version />
<!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 -->
<executions>
<!--execution元素包含了插件执行需要的信息 -->
<execution>
<!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标 -->
<id />
<!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 -->
<phase />
<!--配置的执行目标 -->
<goals />
<!--配置是否被传播到子POM -->
<inherited />
<!--作为DOM对象的配置 -->
<configuration />
</execution>
</executions>
<!--项目引入插件所需要的额外依赖,参见dependencies元素 -->
<dependencies>
......
</dependencies>
<!--任何配置是否被传播到子项目 -->
<inherited />
<!--作为DOM对象的配置 -->
<configuration />
</plugin>
</plugins>
Assemly.xml文件的内容
format:指定打包类型;
includeBaseDirectory:指定是否包含打包层目录(比如finalName是output,当值为true,所有文件被放在output目录下,否则直接放在包的根目录下);
fileSets:指定要包含的文件集,可以定义多个fileSet;
directory:指定要包含的目录;
outputDirectory:指定当前要包含的目录的目的地。