一 介绍
Maven核心上是一个执行插件的框架,所有的工作都由插件完成。插件提供了很多goal,为了同一个目的,并且这些goal可以通过maven执行,如mvn archetype:generate ...(一堆参数)
,archetype
是插件提供给这个goal的前缀
Maven有三个内置的生命周期,即clean,用于清理项目;default,编译部署项目;site,生成网页文档。一个生命周期由一系列phase组成,当maven执行某个phase时,如mvn package
, 会按顺序执行之前的phase和该phase。实际上phase会被映射到底层的goals,也就是说,真正执行的是goals,并且一个phase可以执行多个goals。根据项目的不同打包类型,每个phase使用的goals可能不同。为了执行内置的生命周期,一些插件会默认被maven使用。
default lifecycle常用的phases:
总的,插件可以被归为两类:
-
Build plugins:在项目构建时执行;在pom的
<build/>
元素中配置 -
Reporting plugins:在生成文档时被执行;在pomr的
<reporting/>
元素中配置
具体关于Lifecycle vs. Phase vs. Plugin vs. Goal的区别,请看参考链接
二 生命周期
三个生命周期所有的phase如下所示:
- clean:pre-clean, clean, post-clean
- default:validate, initialize, generate-sources, process-sources, generate-resources,
process-resources, compile, process-classes, generate-test-sources,
process-test-sources, generate-test-resources, process-test-resources,
test-compile, process-test-classes, test, prepare-package, package,
pre-integration-test, integration-test, post-integration-test, verify, install, deploy - site:pre-site, site, post-site, site-deploy
三 其他
3.1 项目三坐标
- groupId:组ID,用于区分所有项目,如在Maven仓库中区分,应该遵循包命名。
- artifactId:包ID,打包后jar名除去版本号的部分。
- version:版本号。如
2.0
,2.0.1
,1.3.1
,而SNAPSHOT
表示帧在开发?
最终的package名可以与groupId、artifactId无关,没有强制约束关系,但一般为两者的组合。
参考:Guide to naming conventions on groupId, artifactId, and version
3.2 依赖
依赖有作用域范围,因此依赖可以划分为很多种,大多可以通过scope
元素指定,而optional、excluded依赖需要专门的元素指定,并可以scopde
依赖合用。
- optional依赖:声明后,即能被该maven项目使用,没有传递性。即A依赖B,B optional依赖C,则A不会引入C。
3.3 父、子POM
一个项目可以由多个相对独立的模块(小项目)组成,每个模块可以存在一个pom文件。为了防止模块之间冗余,父pom抽离子pom间的公共部分,由子pom继承父pom配置,使项目更容易维护。
当父、子pom中属性或依赖冲突时,子pom优先级高。
3.3.1 定义
-
父pom:通过在pom中定义
<packaging>pom</packaging>
来声明; -
子pom:pom中添加
parent
元素,如:<parent> <groupId>top.sidian123.demo</groupId> <artifactId>MavenExamples</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
parent
元素中可定义relativePath
元素,表明父pom相对于当前子pom的位置。默认../pom.xml
,如果不填,则从仓库中查找。
3.3.2 依赖查找
- 先在父pom中查找依赖
- 在本地仓库中查找
- 最后查找远程仓库
3.3.3 dependencyManagement
dependencyManagement
用在父pom文件中,只有子pom中存在dependencyManagement
中的依赖,才会从该依赖中继承未指定的配置,如spring boot中的版本号。
3.4 资源插件
maven默认资源插件负责将项目中资源拷贝到输出目录中。默认资源放在src/main/resources
中。
-
更改默认资源文件夹:
<build> ... <resources> <resource> <directory>src/my-resources</directory> </resource> </resources> ... </build>
-
多个资源目录
<build> ... <resources> <resource> <directory>resource1</directory> </resource> <resource> <directory>resource2</directory> </resource> <resource> <directory>resource3</directory> </resource> </resources> ... </build>
-
仅引入目录中匹配成功的资源:
<build> ... <resources> <resource> <directory>[your directory]</directory> <includes> <include>**/*.txt</include> <include>**/*.rtf</include> </includes> </resource> ... </resources> ... </build>
-
引入目录中所有资源,除了匹配成功的:
<build> ... <resources> <resource> <directory>src/my-resources</directory> <excludes> <exclude>**/*.bmp</exclude> <exclude>**/*.jpg</exclude> <exclude>**/*.jpeg</exclude> <exclude>**/*.gif</exclude> </excludes> </resource> ... </resources> ... </build>
-
对
<includes>
引入的资源用<excludes>
筛选:<build> ... <resources> <resource> <directory>src/my-resources</directory> <includes> <include>**/*.txt</include> </includes> <excludes> <exclude>**/*test*.*</exclude> </excludes> </resource> ... </resources> ... </build>
其他
大致分为三维坐标、属性、依赖、插件和其他
maven三大内置生命周期;周期功能由插件提供;maven含有内置默认插件。
仓库分本地、远程。
properties
定义属性,貌似可以被其他元素或插件使用。因此properties
中元素名可以任意。
固定的目录结构