Maven-配置文件说明
Maven 是基于 POM(Project Object Model) 进行的,项目的所有配置都会放在 pom.xml 文件中,包括项目的类型、名字,依赖关系,插件定制等等
<?xml version="1.0" encoding="UTF-8"?>
<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>
<groupId>com.xx</groupId>
<artifactId>MavenDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>MavenDemo</name>
</project>
- 第一行是XML头,指定了该xml文档的版本和编码方式。
- project 是根元素,声明了一些POM相关的命名空间及xsd元素
- modelVersion指定了当前POM的版本,(Maven 3来说,值只能是4.0.0)
- groupId定义了项目属于哪个组织,通常是组织域名的倒序,来定义
- artifactId定义了项目在组织中的唯一ID
- version指定了项目当前的版本,SNAPSHOT意为快照
- name 项目名称。
- groupId 、artifactId、version(当我们自己写项目提供给其它人使用Maven引,用时用来确定项目的唯一坐标)
<!—用于声明依赖,可包含多个dependency-->
<dependencies>
<!—用于声明依赖-->
<dependency>
<groupId>项目属于哪个组织</groupId>
<artifactId>项目在组织中的唯一ID</artifactId>
<version>版本</version>
<type>依赖类型默认jar</type>
<scope>依赖范围</scope>
<optional>依赖是否可选</optional>
<!—主要用于排除传递性依赖-->
<exclusions>
<exclusion>
<groupId>项目属于哪个组织</groupId>
<artifactId>项目在组织中的唯一ID</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependencies>
- dependencies 可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。
- grounpId、artifactId和version 组成了依赖的基本坐标。
- type 指定了依赖的类型,默认为 jar。
- scope 指定了依赖的范围(详情见下面依赖范围部分)。
- optional 标记了依赖是否是可选的(详情见下面依赖可选部分)。
- exclusions 用来排除传递性依赖(详情见下面依赖排除部分)。
依赖范围有以下5种:
compile,默认的依赖范围,表示依赖需要参与当前项目的编译,后续的测试、运行周期也参与其中,是比较强的依赖。
- test,表示依赖仅仅参与测试相关的工作,包括测试代码的编译和运行。比较典型的如 junit。
- runntime,表示依赖无需参与到项目的编译,不过后期的测试和运行需要其参与其中。
- provided,表示打包的时候可以不用包进去,别的容器会提供。和 compile 相当,但是在打包阶段做了排除的动作。
- system,从参与程度上来说,和 provided 类似,但不通过 Maven 仓库解析,可能会造成构建的不可移植,要谨慎使用。
| 依赖范围 | 编译 | 测试 | 运行 |
|---|---|---|---|
| compile | √ | √ | √ |
| test | √ | ||
| provided | √ | √ | |
| runtime | √ | √ | |
| system | √ | √ |
传递性依赖:
比如一个项目A,A有一个compile范围的B依赖,B有一个compile范围的C依赖,那么C就会成为A的compile范围的依赖,C就是A的一个传递依赖。有了传递性依赖,就不用担心依赖缺失和多余,Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中。
依赖可选:
项目中A依赖B,B依赖于C和D,如果所有这三个的范围都是compile的话,那么C和D就是A的compile范围的传递性依赖,但是如果我想X、Y不作为A的传递性依赖,不给它用的话,可以将dependency中的optional设置为true
依赖排除:
有时候你引入的依赖中包含你不想要的依赖包,你想引入自己想要的,这时候就要用到排除依赖了,比如下图中spring-boot-starter-web自带了logback这个日志包,我想引入log4j2的,所以我先排除掉logback的依赖包,再引入想要的包就行了。同时jar包冲突时部分问题可以采用依赖排除解决掉。
文章内容出自终于把项目构建神器Maven捋清楚了~ | Java 程序员进阶之路 (tobebetterjavaer.com)