1. 简介
Maven在Java领域的应用已经非常广泛了,有了Maven的存在是的开发人员在搭建、依赖、扩展和打包项目上变得非常简单。
2. Windows安装Maven
- 下载安装包
http://maven.apache.org/download.cgi - 解压到安装目录,例如:D:maven
- 配置环境变量
- 新增MAVEN_HOME
MAVEN_HOME D:mavenapache-maven-3.6.3
- path中添加
;%MAVEN_HOME%in
- 在控制台测试
mvn -v
- 出现版本信息等,即为安装成功
- 配置本地仓库路径
# 打开:D:mavenapache-maven-3.6.3confsettings.xml <localRepository>D:mavenmaven-repository</localRepository>
- 配置阿里镜像仓库,加速下载
# 打开:D:mavenapache-maven-3.6.3confsettings.xml,在<mirrors></mirrors>下添加 <mirror> <id>AliMaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
3. Maven基础知识
3.1. 本地仓库、私服、中央仓库
私服根据实际情况可有可无。
本地仓库:主要作用为在本地缓存jar包。项目需要依赖某些jar包时,先去本地仓库找,找不到再去私服找,私服找不到就去中央仓库找。
私服:主要作用为存储公司内部jar。假如某项目A依赖别的项目B,不可能将项目B引入到本地,也不可能每次找项目B团队打包,因此将项目B的jar上传到私服,每次直接从私服获取即可。另外,私服还充当了中央仓库的角色。
中央仓库:主要作用为仓库存储了互联网上的jar,由Maven团队来维护。
3.2. Maven坐标
- groupId
组织名称 - artifactId
项目名称 - version
版本 - scope
依赖范围。共有3种作用域,分别是编译、测试和运行时期。值有6种类型,分别是:
compile:默认值,编译测试和运行都有效;
provided:编译和测试的时有效,运行时不生效;
runtime:测试和运行时有效;
test:只在测试的时有效;
system:编译和测试的时有效,与本机系统关联,可移植性较差;
import:导入的范围,使用在dependencyManagement标签中,表示从其他的pom中导入dependency的配置。
例如:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
3.3. 版本
version分为开发版本(Snapshot)和发布版本(Release)。
在实际开发中,经常存在项目A依赖项目B,项目B在测试过程中,需要经常修改代码,为了避免冲突,需要每次变更版本号,因此项目A也需要跟着变更。其实Maven已经提供了解决办法,就是使用Snapshot版本,当项目B修改代码后,发布到私服时会形成带有时间戳版本号的Snapshot版本,每次项目A在构建项目时会自动下载项目B的最新版本。当项目B稳定后,即可使用Release版本,发布到私服。
3.4. 依赖冲突
例如:项目A依赖项目B和项目C,但是项目B和项目C分别依赖不同版本的项目D,则出现项目A到底依赖那个版本的项目D。
解决依赖冲突需要遵循3个基本的原则:
(1)短路优先
例如:A → B → C → X.v1.jar,A → D → X.v2.jar,则A最终依赖X.v2.jar。
(2)后声明先解析
例如:A同时依赖X.v1.jar和X.v2.jar,则A最终依赖X.v2.jar。
(3)依赖传递
例如:A → B,B → C,则A都依赖B和C。
也可使用exclusions标签排除依赖。例如:
<dependencies>
<dependency>
<groupId>com.c3stones</groupId>
<artifactId>A</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.c3stones</groupId>
<artifactId>X</artifactId>
<version>1.0-SNAPSHOT</version>
</exclusion>
</exclusions>
</dependency>
</dependencies>
3.5. 构建命令
命令 | 说明 |
---|---|
mvn compile | 编译 |
mvn clean | 清除target目录 |
mvn test | 测试 |
mvn package | 打包 |
mvn install | 上传到本地仓库 |
mvn deploy | 上传到私服 |
常用命令(去除单元测试):mvn clean install -Dmaven.test.skip=true
3.6. Maven聚合
- 创建工程P,将packaging设置为pom
- 创建工程A、B、C
- 在工程P的pom为文件中将工程A、B、C聚合
<modules>
<module>A</module>
<module>B</module>
<module>C</module>
</modules>
3.7. pom文件标签说明
标签 | 说明 |
---|---|
groupId | 组织 |
artifactId | 项目名称 |
packaging | 打包方式 |
version | 版本号 |
name | 项目描述名 |
description | 项目描述 |
parent | 父依赖 |
properties | 参数 |
dependencies | 依赖列表 |
dependency | 依赖项 |
dependencyManagement | 依赖管理 |
build | 构建配置 |
plugins | 插件列表 |
plugin | 插件 |
modules | 聚合模块列表 |
module | 聚合模块 |
4. Maven创建SpirngBoot工程配置文件
<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.c3stones</groupId>
<artifactId>spring-boot-maven-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-maven-demo</name>
<description>Spring Boot Maven Demo</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.8.RELEASE</version>
<relativePath />
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>