目录
一、生命周期和阶段
maven有以下三个标准的生命周期:
-
clean:项目清理的处理,包含3个阶段:pre-clean、clean、post-clean
-
default(或 build):项目部署的处理,包含23个阶段:validate、...、compile(编译)、...、package(打包)、...、deploy(部署)
-
site:项目站点文档创建的处理
二、配置
优先级:项目的pom.xml > 用户配置 > 全局配置
类型 | 在哪 |
---|---|
用户配置 | 定义在%USER_HOME%/.m2/settings.xml,其中 %USER_HOME% 代表用户主目录 |
全局配置 | 定义在%M2_HOME%/conf/settings.xml,其中 %M2_HOME% 代表maven的安装目录 |
idea可以指定用户配置、全局配置、本地仓库:
maven全局配置文件settings.xml详解:参考https://www.cnblogs.com/soupk/p/9303611.html
三、依赖
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>3.8.1</version>
<!--依赖范围-->
<scope>test</scope>
<!--依赖排除 -->
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
<!-- true表示可选,可阻断依赖的传递 -->
<optional>true</optional>
</dependency>
1. 依赖范围
compile:默认的范围,编译、测试运行都有效
provided:编译测试有效
runtime:测试运行时有效
test:在测试时有效
system:与本机系统相关联,移植性差(和provided范围一致)
2. 依赖冲突与解决
依赖冲突:一个项目A,通过不同依赖传递路径依赖于X,若在不同路径下传递过来的X版本不同,那么A应该导入哪个版本的X包呢?
冲突解决方案:
(1)如果依赖路径的长度不同,则“短路优先”:
A—>B—>C—>D—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
则A依赖于X(version 0.0.2)。
(2)依赖路径长度相同情况下,则“先声明优先”:
A—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
则A依赖于X(version 0.0.2)。
四、插件
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.10</version>
<executions>
<execution>
<id>default-compile</id>
<phase>process-classes</phase>
<goals>
<!--不是指maven的compile阶段-->
<goal>compile</goal>
</goals>
<configuration>
<weaveDirectories>
<weaveDirectory>${project.build.directory}/classes</weaveDirectory>
</weaveDirectories>
</configuration>
</execution>
</executions>
</plugin>
phase是指在哪个阶段执行插件
goal是指特定plugin提供的一个个小的功能程序,比如上述aspectj编译插件的plugin.xml中描述了5种功能:aspectj-report、compile、EclipseAjcMojo、help、test-compile
五、指令
maven执行任务或目标时,会在当前目录中查找pom.xml;读取pom.xml,获取所需的配置信息,然后执行目标。
指令 | 作用 |
mvn help:effective-pom | 展示父pom + 工程自身的pom的最终配置,比如项目pom.xml中没有显示定义repository,实际定义在父pom中 |
mvn 生命周期X的阶段Y | 从生命周期X的第1个阶段 ===执行到===> 阶段Y |
mvn deploy | 执行build所有阶段,根据distributionManagement元素提供的项目分发信息把网站部署到远程服务器或者把构件部署到远程仓库 |
mvn 阶段Y -P某profile的id | 使用指定的profile,可以覆盖构建默认值 |