Maven从入门到精通(二)
一、什么是pom.xml
pom.xml是Maven项目的核心配置文件,它是 项目对象模型 - Project Object Model(POM)的缩写。POM定义了项目的所有属性,包括项目的名称、版本、依赖关系、构建配置等。使用pom.xml,我们可以轻松地管理项目的构建和依赖关系,让我们能够更专注于业务逻辑的开发。
二、POM文件说明
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>My Project</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<parent>
<!-- 父POM的声明 -->
</parent>
<modules>
<!-- 子模块 -->
</modules>
<distributionManagement>
<!-- 部署管理 -->
</distributionManagement>
<repositories>
<!-- 仓库配置 -->
</repositories>
<pluginRepositories>
<!-- 插件仓库配置 -->
</pluginRepositories>
<dependencies>
<!-- 项目依赖 -->
</dependencies>
<build>
<plugins>
<!-- 构建过程中使用的插件 -->
</plugins>
</build>
<reporting>
<!-- 报告配置 -->
</reporting>
</project>
说明如下:
-
modelVersion
: 指定了POM模型版本。 -
groupId
: 项目组ID,通常是项目的包名。 -
artifactId
: 项目构件ID,通常是项目名。 -
version
: 项目版本,可以加上SNAPSHOT作为快照版本。 -
packaging
: 打包方式,如jar
,war
. -
name
: 项目的展示名。 -
url
: 项目的URL。 -
properties
: 自定义属性。 -
dependencies
: 项目依赖列表。 -
build
: 构建配置,包括插件配置等。 -
parent
: 父POM,用于继承。 -
modules
: 子模块列表。 -
distributionManagement
: 部署管理配置。 -
repositories
: 仓库配置,用于依赖的存储。 -
pluginRepositories
: 插件仓库配置。 -
reporting
: 报告配置,用于站点生成。
三、补充说明
1、依赖冲突
如果依赖有冲突,那实际采用的版本遵循以下原则。
- 最短路径优先
- 声明优先
2、屏蔽依赖
如果项目A引入了一个依赖a,其他项目依赖项目A时会自动引入依赖a,如果我们不希望其他项目因为项目A引入依赖a时,我们可以在项目A引入依赖a时进行配置optional选项,令值为true即可。
比如Project2引入了Project1,而Project1引入了log4j依赖。我们可以看到Project2也引入了log4j
这是我们在Project1的pom文件中设置,令optional=true
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<optional>true</optional>
</dependency>
刷新一下Maven,就可以看到Proejct2不再引入log4j
依赖了。
3、排除依赖
想要Project2不间接依赖log4j
的话,也可以主动在Project2的Pom文件中配置。使用<exclusions>
。这样也可以达到目的。
<dependency>
<groupId>com.mavenlearning.project1</groupId>
<artifactId>Project1</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
4、依赖范围
依赖范围是指导入的依赖可以在项目中的哪些阶段或者位置使用,使用<scope
来定义。比如引入一个依赖junit
的scope=test
,那junit
这个依赖包只能在test方法中使用。其中, 打包范围是指packaging指令的范围。
scope | 主程序 | 测试代码 | 打包 | 范例 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | log4j |
test | Y | junit | ||
provided | Y | Y | servlet-api | |
runtime | Y | jdbc |
5、聚合管理
我们可以建立一个新项目,就叫Project,这个项目是个空项目,我把src下的文件都删了,只留一个pom.xml
文件。
建立这个项目的目的是为了聚合管理剩下的三个项目。在Project的pom.xml文件中将<packaging>的值设为pom。表示这个项目是个空的项目。
之后加上<modules>标签,表示聚合管理这些项目,以后对Project进行的maven操作都会一起作用到<modules>中定义的项目
现在我们对Project项目进行install操作,日志如下。可以看到Project1,2,3都被一起install了。
6、dependencyManagement标签
<dependencies>是定义项目的依赖,定义好之后,项目会去加载对应的依赖。<dependencyManagement>中是存放依赖的定义。等到需要用到依赖的时候就在<dependencies>指定<actifactId>和<groupId>即可。
比如下面就没有指定spring-contexg的版本,但是项目是知道要去使用5.3.15的。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.15</version>
</dependency>
</dependencies>
</dependencyManagement>
通常来说,这个标签是用来统一管理依赖,一般在父项目中定义依赖,子项目就使用父项目中的依赖,不会导致版本号不一致的情况。