Maven使用手册
什么是Maven
Maven是一个软件项目管理和理解工具,基于项目对象模型(Project Object Model,POM)的概率,Maven可以从一条中心信息管理项目的构建,报告和文档。
对于开发着来说,Maven提供了一下三个作用:
- 项目构建
- 依赖管理
- 统一开发结构
Maven坐标
项目中的依赖和插件都可以称为构件,每一个构件可以使用坐标唯一标识。
坐标包含以下元素:
- groupId(必须):项目隶属的组织
- artifactId(必须):项目的名称
- version(必须):项目的版本
- packaging(可选):项目打包方式,默认为jar
- classifer(可选):用于区分同一POM构件的具有不同内容的构件,可以是任意字符。
XML
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>常用构件搜索网站:
Maven依赖
在项目pom中添加构件的坐标,实现对构件的引用。
XML
<project>
<dependencies>
<dependency>
<groupId/>
<artifactId/>
<version/>
<type>...</type>
<scope>...</scope>
<optional>...</optional>
<exclusions>
<exclusion>
<groupId>...</groupId>
<artifactId>...</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>配置说明:
- dependencies:一个pom.xml文件只能存在一个该标签,定义项目的依赖。
- dependency:表示一个项目的依赖。
- groupId、artifactId、version(可选):表示依赖的坐标。
- type(可选):依赖的类型。对应项目定义中的packaging,一般不用显式声明,默认为jar。
- scope(可选):依赖的范围。默认值为complie。有以下几种:
- complie:参与到编译、测试、运行
- provide:参与到编译、测试
- runtiem:参与到测试、运行
- test:参与到测试编译、测试运行
- system:指定本地路径的jar包
- import:只能在
<dependencyManagement>中使用,导入其他项目的依赖。
- optional(可选):标记依赖是否可选。
- exclusions(可选):排除传递性依赖,例如jar包冲突。
依赖管理
依赖管理声明了引入构件的版本,作用如下:
- 在管理多模块时,保持各子模块引用的构件版本一致。
- 引入官方的依赖管理配置,可避免自行配置时产生依赖冲突。
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0</version>
<!--添加了type和scopre才会在当前模块生效-->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>依赖冲突
- 若添加了相同类型但版本不同的依赖,会产生依赖冲突,此时只有后声明的依赖生效。
- 项目中的两个依赖引入了类型相同但版本不同的依赖,此时会产生依赖冲突,Maven会遵从传递依赖调解规则解决冲突
传递依赖调解规则
- 路径最短优先
- 声明顺序优先
Maven仓库
Maven仓库分为:
- 本地仓库
- 远程仓库
远程仓库分为:
- 中央仓库
- 私服
- 其他的公共仓库:如阿里云Maven镜像仓库
Maven依赖包寻找顺序:
- 先在本地仓库查找,如果有,则直接引用。
- 如果本地仓库没有,则到远程仓库查找。如果有,则直接引用。
- 如果远程仓库也没有,则报错。
Maven生命周期
- default周期
- clean周期
- site周期
defaule周期
Maven的主要生命周期,用于构建项目,共包含23个阶段。
XML
<phases>
<!-- 验证项目是否正确,并且所有必要的信息可用于完成构建过程 -->
<phase>validate</phase>
<!-- 建立初始化状态,例如设置属性 -->
<phase>initialize</phase>
<!-- 生成要包含在编译阶段的源代码 -->
<phase>generate-sources</phase>
<!-- 处理源代码 -->
<phase>process-sources</phase>
<!-- 生成要包含在包中的资源 -->
<phase>generate-resources</phase>
<!-- 将资源复制并处理到目标目录中,为打包阶段做好准备。 -->
<phase>process-resources</phase>
<!-- 编译项目的源代码 -->
<phase>compile</phase>
<!-- 对编译生成的文件进行后处理,例如对 Java 类进行字节码增强/优化 -->
<phase>process-classes</phase>
<!-- 生成要包含在编译阶段的任何测试源代码 -->
<phase>generate-test-sources</phase>
<!-- 处理测试源代码 -->
<phase>process-test-sources</phase>
<!-- 生成要包含在编译阶段的测试源代码 -->
<phase>generate-test-resources</phase>
<!-- 处理从测试代码文件编译生成的文件 -->
<phase>process-test-resources</phase>
<!-- 编译测试源代码 -->
<phase>test-compile</phase>
<!-- 处理从测试代码文件编译生成的文件 -->
<phase>process-test-classes</phase>
<!-- 使用合适的单元测试框架(Junit 就是其中之一)运行测试 -->
<phase>test</phase>
<!-- 在实际打包之前,执行任何的必要的操作为打包做准备 -->
<phase>prepare-package</phase>
<!-- 获取已编译的代码并将其打包成可分发的格式,例如 JAR、WAR 或 EAR 文件 -->
<phase>package</phase>
<!-- 在执行集成测试之前执行所需的操作。 例如,设置所需的环境 -->
<phase>pre-integration-test</phase>
<!-- 处理并在必要时部署软件包到集成测试可以运行的环境 -->
<phase>integration-test</phase>
<!-- 执行集成测试后执行所需的操作。 例如,清理环境 -->
<phase>post-integration-test</phase>
<!-- 运行任何检查以验证打的包是否有效并符合质量标准。 -->
<phase>verify</phase>
<!-- 将包安装到本地仓库中,可以作为本地其他项目的依赖 -->
<phase>install</phase>
<!-- 将最终的项目包复制到远程仓库中与其他开发者和项目共享 -->
<phase>deploy</phase>
</phases>clean周期
clean周期的作用是清理项目,包含3个阶段
XML
<phases>
<!-- 执行一些需要在clean之前完成的工作 -->
<phase>pre-clean</phase>
<!-- 移除所有上一次构建生成的文件 -->
<phase>clean</phase>
<!-- 执行一些需要在clean之后立刻完成的工作 -->
<phase>post-clean</phase>
</phases>
<default-phases>
<clean>org.apache.maven.plugins:maven-clean-plugin:2.5:clean</clean>
</default-phases>site周期
site周期的作用是生成项目文档和将项目文档发布站点,包含4个阶段
XML
<phases>
<!-- 执行一些需要在生成站点文档之前完成的工作 -->
<phase>pre-site</phase>
<!-- 生成项目的站点文档作 -->
<phase>site</phase>
<!-- 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备 -->
<phase>post-site</phase>
<!-- 将生成的站点文档部署到特定的服务器上 -->
<phase>site-deploy</phase>
</phases>
<default-phases>
<site>org.apache.maven.plugins:maven-site-plugin:3.3:site</site>
<site-deploy>org.apache.maven.plugins:maven-site-plugin:3.3:deploy</site-deploy>
</default-phases>Maven多模块管理
将一个项目拆分为多个独立的模块,每一个模块拥有一个pom文件,在项目的pom文件中包含所有模块的信息。
Maven镜像配置
Maven文件地址:maven根目录/conf/settings.xml
XML
<!--定义本地仓库目录-->
<localRepository>E:\maven\repository</localRepository>
<!--定义镜像仓库地址-->
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>Maven常用配置
配置源代码编码方式为UTF-8
xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>配置编译源代码的JDK版本
xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>Maven常用命令
- 查看mvn版本号
mvn -v - 清理项目
mvn clean - 打包项目
mvn package - 打包项目跳过测试
bash
mvn clean install -Dmaven.test.skip=true