Maven快速入门
对以下视频的整理:https://www.bilibili.com/video/BV1Ah411S7ZE?p=1&vd_source=d57b2df928037367dfb7f5027819b5ec
1 Maven简介(概念与作用)
1.1 Maven 是什么
本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM,Project Object Model)
一个项目就是一个对象,Maven工程结构和内容被定义在 pom.xml 中,该文件是整个Maven工作的核心
Maven使用依赖管理(Dependency)进行对项目依赖资源的管理。它和POM之间是一种双向关系,即我们的项目可以用别的资源,也可以被其它项目作为资源。依赖资源所管理的资源,主要在三个位置:
- 本地仓库:存储在本地的一种资源仓库,本地没有去私服获取
- 私服仓库:远程仓库,保存公共的信息,大家共享,私服没有去中央获取
- 中央仓库:远程仓库
Maven除了能管理项目资源之外还能对项目进行构建,管理项目的整个生命周期,但需要使用一些相关的插件来完成。
![image-20230227220500182](https://i-blog.csdnimg.cn/blog_migrate/0d7d90dd5998f3fbb9546586dcbeebec.png)
Maven的核心包含中间蓝色部分,不包含外围。虚线以上是对项目的操作过程,虚线以下Maven已经做好了所有工作,准备了无数插件。
1.2 Maven的作用
- 项目构建:提供标准的、跨平台的自动化项目构建方式
- 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
- 统一开发结构:提供标准的、统一的项目结构(做的太好了,大家都按照这个结构来)
![image-20230227221552004](https://i-blog.csdnimg.cn/blog_migrate/f8f53d219f081574cab45ecf2a9ca212.png)
2 Maven基本概念
2.1 仓库
用于存储资源,包含各种 jar 包
所有的 jar 包基本都被保存在中央仓库中(由maven管理),可以下载下来保存在本地仓库中。为解决很多人访问下载导致网络速度慢,出现了私服,比如说一个公司/部门。
![image-20230228194734186](https://i-blog.csdnimg.cn/blog_migrate/9fadeda9c9a59743933efef5d8b93e28.png)
- 仓库分类:
- 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
- 远程仓库:非本机上的仓库,为本地仓库提供资源
- 中央仓库:Maven团队维护,存储所有资源的仓库
- 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源
- 私服的作用:
- 保存具有版权的资源,包含购买或自主研发的 jar(中央仓库中的 jar 都是开源的)
- 一定范围内共享资源,仅对内部开放
- 访问快
2.2 坐标
什么是坐标:
资源越来越多时,寻找资源就成为了一个问题。Maven中的坐标用于描述仓库中资源的位置。
Maven坐标主要组成:
- groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybatis)
- artifactId:定义当前Maven项目名称(通常是模块名称,例如CRM、SMS)
- version:定义当前项目版本号
中央仓库网址:https://mvnrepository.com/
在仓库中搜索想要的 jar ,可找到坐标,格式如下:
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
坐标的作用:
使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成
2.3 仓库配置
本地仓库配置
Maven启动后,会自动保存下载的资源到本地仓库
打开"D:\environment\apache-maven-3.9.0\conf\settings.xml",
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
可以发现默认位置在${user.home}/.m2/repository
中,我们在该注释外加入以下代码就可以保存到自定义的位置中:
<localRepository>D:\maven\repository</localRepository>
镜像仓库配置
还是在\conf\settings.xml
文件中,第160左右,代码如下:
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
<!-- 配置具体的仓库下载镜像 -->
<mirror>
<!-- 此镜像的唯一标识符,用来区分不同的mirror元素 -->
<id>nexus-aliyun</id>
<!-- 对哪种仓库进行镜像,简单来说就是代替哪个仓库 -->
<mirrorOf>central</mirrorOf>
<!-- 镜像名称 -->
<name>Nexus aliyun</name>
<!-- 镜像URL -->
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
全局 setting 与用户 setting 区别
- 全局setting定义了当前计算器中Maven的公共配置
- 就是上述提到的
\conf\settings.xml
文件
- 就是上述提到的
- 用户setting定义了当前用户的配置
- 上述提到的本地仓库配置中的repository文件夹(与该文件夹同级的setting.xml文件)
3 Maven项目基本概念
3.1 Maven工程目录结构
![image-20230302162555802](https://i-blog.csdnimg.cn/blog_migrate/7a1e7e8fd5a28ef6f754ad8710ea1281.png)
要在src同层目录下创建pom.xml
一个简单的.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 ttp://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--版本-->
<modelVersion>4.0.0</modelVersion>
<!--Maven坐标:组织名称、项目名称、版本号-->
<groupId>cn.edu.zucc</groupId>
<artifactId>maven-basic</artifactId>
<version>1.0</version>
<!--项目依赖的资源-->
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
</dependencies>
</project>
3.2 Maven构建命令
- mvn compile # 编译
- mvn clean # 清理
- mvn test # 测试
- mvn package # 打包
- mvn install # 安装到本地仓库
编译、测试、打包完成的东西会保存到与 src 同级的 target 文件夹中,清理就是删掉target文件夹
其中,package命令先执行了编译、测试,然后才打包;install,同样也经历了编译测试打包,然后把打包的东西放到了本地仓库(就是上面我们定义的D:\maven\repository)下的cn\eduzucc(pom.xml文件中定义的groupId)下的maven-basic(artifactId)文件夹中的1.0(version)文件夹中。
3.3 插件创建工程
Maven提供插件,可以使用模板直接创建项目
-
创建工程
mvn archetype:generate -DgroupId={project-packaging} -Dartifactid={project-name} -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
-
创建java工程
mvn archetype:generate -DgroupId=com.itheima -Dartifactid=java-project -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -DinteractiveMode=false
-
创建web工程
mvn archetype:generate -DgroupId=com.itheima -DartifactId=web-projectDarchetypeArtifactId-maven-archetype-webapp -Dversion=0.0.1-snapshot -DinteractiveMode=false
3.4 java和web工程目录结构的差异
![image-20230302172654313](https://i-blog.csdnimg.cn/blog_migrate/0b241bfc74dd552487898b0685666715.png)
3.5 IDEA构建Maven项目
jdk设置
Maven设置
setting中:
project structure中:
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">
<!--指定pom的模型版本-->
<modelVersion>4.0.0</modelVersion>
<!--打包方式:web打包为war,java打包为jar-->
<packaging>war</packaging>
<!--组织id-->
<groupId>com.hhq</groupId>
<!--项目id-->
<artifactId>java01</artifactId>
<!--版本号:release——完成版;snapshot——开发版-->
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--当前项目的所有依赖-->
<dependencies>
<!--具体的依赖-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
</dependencies>
</project>
运行Demo测试
package com.hhq;
import org.apache.commons.lang3.RandomStringUtils;
public class Demo {
public static void main(String[] args) {
String randomValue = RandomStringUtils.randomAlphabetic(6);
System.out.println(randomValue);
}
}
4 依赖管理
4.1 依赖配置
依赖指当前项目运行所需的jar,一个项目可以设置多个依赖
格式:
<!--当前项目的所有依赖-->
<dependencies>
<!--具体的依赖-->
<dependency>
<!--依赖所属群组id-->
<groupId>org.apache.commons</groupId>
<!--依赖所属项目id-->
<artifactId>commons-lang3</artifactId>
<!--依赖版本号-->
<version>3.9</version>
</dependency>
</dependencies>
4.2 依赖传递
依赖具有传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被直接依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
依赖传递遇到冲突问题的三个原则
- 路径优先:当依赖中出现相同的资源时,就近原则(层级越深,优先级越低,层级越浅,优先级越高)
- 声明优先:当资源在相同层级被依赖时,就早原则(配置顺序靠前的覆盖配置顺序靠后的)
- 特殊优先:当同级配置了相同资源的不同版本,就最近原则(后配置的覆盖先配置的)
4.2.1 可选依赖
指对外隐藏当前所依赖的资源——不透明
加一个 optional
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
<!--可选依赖-->
<optional>true</optional>
</dependency>
4.2.2 排除依赖
排除依赖指主动断开依赖的资源,被排除的资源无需指定版本一一不需要
加exclusions
排除哪些,exclusion
排除哪个(不要写版本)
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>com.hhq</groupId>
<artifactId>project01</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
4.3 依赖范围
依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其作用范围
作用范围:
- 主程序范围有效(main文件夹范围内)
- 测试程序范围有效(test文件夹范围内)
- 是否参与打包(package指令范围内)
scope | 主代码 | 测试代码 | 打包 | 范例 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | log4j |
test | Y | junit | ||
provided | Y | Y | servlet-api | |
runtime | Y | jdbc |
4.4 依赖范围传递性
带有依赖范围的资源在进行传递时,作用范围将受到影响
![image-20230302221503462](https://i-blog.csdnimg.cn/blog_migrate/2ced651a898ec5ffb55549b6aac28fa5.png)
5 生命周期与插件
5.1 构建生命周期
Maven构建生命周期描述的是一次构建过程经历经历了多少个事件
大致的过程:
Maven对项目构建的生命周期划分为3套
-
clean:清理工作
- pre-clean:执行一些需要在clean之前完成的工作
- clean:移除所有上一次构建生成的文件
- post-clean:执行一些需要在clean之后立刻完成的工作
-
default:核心工作,例如编译、测试、打包、部署等
-
site:产生报告,发布站点等
当执行编译、测试、安装时执行的步骤如下图所示,其中,当我们指定执行到某一步骤时,也会执行从开始到指定位置
5.2 插件
- 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能(每个小阶段都有对应的插件)
- 默认maven在各个生命周期上绑定有预设的功能
- 通过插件可以自定义其他功能
Maven官网插件: https://maven.apache.org/plugins/index.html
<bui1d>
<plugins>
<plugin>
<!--插件坐标-->
<groupId>org.apache .maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<!--在什么阶段执行什么插件-->
<executions>
<execution>
<!--执行什么:在官网中都有解释-->
<goals>
<goal>jar</goal>
</goals>
<!--在什么阶段:参照上面图片,是生成测试源代码阶段-->
<phase>generate-test-resources</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>