Maven学习笔记
Maven
以下内容是我对菜鸟Maven教程的整理和补充
环境配置
- 配置Java环境
- 下载Maven,Maven官方下载地址,选择下载
Binary zip archive
- 在系统环境变量中新建一条变量,变量名为
MAVEN_HOME
,变量值为Maven解压文件位置
- 在系统环境变量
path
中添加;MAVEN_HOME\bin;
- 在控制台运行
mvn -v
检查是否配置成功pom文件
教程中POM文件中详解太多了,我们不是常用到,这里我节选了我用到的一些,填上了少量的我自己内容
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126<!--所有 POM 文件都需要 project 元素和三个必需字段:groupId,artifactId,version。-->
<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.0http://maven.apache.org/maven-v4_0_0.xsd">
<!--父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。
坐标包括group ID,artifact ID和 version。 -->
<parent>
<!--被继承的父项目的全球唯一标识符 -->
<groupId>org.zxw</groupId>
<!--被继承的父项目的构件标识符 -->
<artifactId>learnmaven</artifactId>
<!--被继承的父项目的版本 -->
<version>1.0-SNAPSHOT</version>
</parent>
<!--模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径 -->
<modules>
<module>learnmavenchild</module>
</modules>
<!--声明项目描述符遵循哪一个POM模型版本。-->
<modelVersion>4.0.0</modelVersion>
<!--项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目。
并且构建时生成的路径也是由此生成, 如com.mycompany.app生成的相对路径为:/com/mycompany/app -->
<!--my 建议域名后缀.公司名称 常用的域名后缀有com(商业公司) top(个人) net(网络) org(非盈利组织) edu(教育)-->
<groupId>org.zxw</groupId>
<!-- 构件的标识符,它和group ID一起唯一标识一个构件。
换句话说,你不能有两个不同的项目拥有同样的artifact ID和groupID;
在某个特定的group ID下,artifact ID也必须是唯一的。
构件是项目产生的或使用的一个东西,Maven为项目产生的构件包括:JARs,源 码,二进制发布和WARs等。 -->
<!--my 建议项目名称-->
<artifactId>learnmavenchild1</artifactId>
<!--项目产生的构件类型,例如jar、war、ear、pom。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型 -->
<packaging>jar</packaging>
<!--项目当前版本,格式为:主版本.次版本.增量版本-限定版本号 -->
<version>1.0-SNAPSHOT</version>
<!--以值替代名称,Properties可以在整个POM中使用,也可以作为触发条件。格式是<name>value</name>。 -->
<properties>
<!-- my 指定java版本 -->
<java-version>1.8</java-version>
<!-- my 指定编码格式 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- my 自定义引用 -->
<spring.version>5.0.9.RELEASE</spring.version>
<mybatis.version>3.4.6</mybatis.version>
<mybatis-spring.version>1.3.2</mybatis-spring.version>
</properties>
<!--该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。 -->
<dependencies>
<dependency>
<!--依赖的group ID -->
<groupId>org.apache.maven</groupId>
<!--依赖的artifact ID -->
<artifactId>maven-artifact</artifactId>
<!--依赖的版本号。 在Maven 2里, 也可以配置成版本号的范围。 -->
<version>3.8.1</version>
<!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。
- compile :默认范围,用于编译
- provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
- runtime: 在执行时需要使用
- test: 用于test任务时使用
- system: 需要外在提供相应的元素。通过systemPath来取得
- systemPath: 仅用于范围为system。提供相应的路径
- optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用 -->
<scope>test</scope>
<!--当计算传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。
即告诉maven你只依赖指定的项目,不依赖项目的依赖。此元素主要用于解决版本冲突问题 -->
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
<!--可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。
可选依赖阻断依赖的传递性。 -->
<optional>true</optional>
</dependency>
</dependencies>
<!--构建项目需要的信息 -->
<build>
<!--产生的构件的文件名,默认值是${artifactId}-${version}。 -->
<finalName>mavenchild</finalName>
<!--这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。 -->
<resources>
<!--这个元素描述了项目相关或测试相关的所有资源路径 -->
<resource>
<!--描述存放资源的目录,该路径相对POM路径 -->
<directory>${basedir}/src/main/java</directory>
<!--包含的模式列表,例如**/*.xml. -->
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!--排除的模式列表,例如**/*.xml -->
<excludes/>
</resource>
</resources>
<!--这个元素描述了单元测试相关的所有资源路径,例如和单元测试相关的属性文件。 -->
<testResources>
<!--这个元素描述了测试相关的所有资源路径,参见build/resources/resource元素的说明 -->
<testResource/>
</testResources>
<!--使用的插件列表 -->
<plugins>
<!--plugin元素包含描述插件所需要的信息。 -->
<plugin>
<!--插件在仓库里的group ID -->
<groupId>org.apache.maven.plugins</groupId>
<!--插件在仓库里的artifact ID -->
<artifactId>maven-war-plugin</artifactId>
<!--被使用的插件的版本(或版本范围) -->
<version>2.6</version>
<!--作为DOM对象的配置 -->
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>构建生命周期
graph TD 开始-->validate-->compile-->test-->package-->verify-->install-->deploy-->结束
阶段 | 处理 | 描述 |
---|---|---|
验证 validate | 验证项目 | 验证项目是否正确且所有必须信息是可用的 |
编译 compile | 执行编译 | 源代码编译在此阶段完成 |
测试 Test | 测试 | 使用适当的单元测试框架(例如JUnit)运行测试。 |
包装 package | 打包 | 创建JAR/WAR包如在 pom.xml 中定义提及的包 |
检查 verify | 检查 | 对集成测试的结果进行检查,以保证质量达标 |
安装 install | 安装 | 安装打包的项目到本地仓库,以供其他项目使用 |
部署 deploy | 部署 | 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程 |
仓库
maven仓库分为三种类型:
- 本地(local)
- 中央(central)
- 远程(remote)
本地仓库
- Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。
- 运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
- 默认情况下,不管Linux还是 Windows,每个用户在自己的用户目录下都有一个路径名为 .m2/respository/ 的仓库目录。
- Maven 本地仓库默认被创建在 %USER_HOME% 目录下。要修改默认位置,在 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。
1
2
3
4
5
6<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>C:/MyLocalRepository</localRepository>
</settings>中央仓库
Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。
中央仓库的关键概念:
- 这个仓库由 Maven 社区管理
- 不需要配置
- 需要通过网络才能访问
maven资源仓库,菜鸟上推荐的并不好用.
远程仓库
如果 Maven 在中央仓库中也找不到依赖的文件,它会停止构建过程并输出错误信息到控制台。
为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件。
maven依赖搜索顺序
当我们执行 Maven 构建命令时,Maven 开始按照以下顺序查找依赖的库:
- 步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
- 步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用。
- 步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
- 步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。
阿里云仓库配置
Maven 仓库默认在国外, 国内使用难免很慢,我们可以更换为阿里云的仓库
- 修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件,在 mirrors 节点上,添加内容如下:
1
2
3
4
5
6
7
8<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors> - pom.xml文件里添加:在我的实际开发中第二部并没有配置,也是可以正常使用的.(这里有时间再来研究)
1
2
3
4
5
6
7
8
9
10
11
12
13<repositories>
<repository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>依赖管理
maven依赖原则
- 依赖最短路径优先原则
例如:A->B->X(1.0),A->C->D->X(1.0),那么A依赖的X版本为1.0版本. - pom文件中申明顺序优先
例如:A->B->X(1.0),A->C->X(2.0),路径一样长,A的pom中先申明了B,再申明了C,那么A依赖的X版本为1.0版本. - 覆写优先
子pom内声明的优先于父pom中的依赖