doc/笔记/Maven的基本使用-maven-jiao-cheng.md

261 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Maven的基本使用
date: 2023-04-22 16:18:15.469
updated: 2023-05-13 10:35:29.575
url: /archives/maven-jiao-cheng
categories:
- Java
tags:
---
## 1.安装Maven
### 1.1下载
Maven官网下载地址https://maven.apache.org/download.cgi
### 1.2安装
解压至指定目录,例如我的路径就是`D:\apache-maven-3.9.1` ,路径里不要有中文或特殊符号
### 1.3修改本地仓库位置
Maven配置文件所在路径为D:\apache-maven-3.9.1\conf\settings.xml
![maven-01](https://images.qweraq.com/images/image-20230422145616987.png)
**记得要把 localRepository 标签从注释中拿出来**
### 1.4配置阿里云提供的镜像仓库
将原有的例子配置注释掉
加入阿里云镜像仓库
```xml
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
```
![maven-02](https://images.qweraq.com/images/image-20230422153346870.png)
### 1.5配置基础 JDK 版本
Java 工程使用的默认 JDK 版本是 1.5`profile` 标签整个复制到 `settings.xml` 文件的 `profiles` 标签内
```xml
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
```
### 1.6配置Maven环境变量
`MAVEN_HOME`
`D:\apache-maven-3.9.1`
`PATH`
`%MAVEN_HOME%\bin`
> 配置环境变量的规律:
>
> XXX_HOME 通常指向的是 bin 目录的上一级
>
> PATH 指向的是 bin 目录
## 2. Maven 的使用
### 3.1 核心概念:坐标
**数学中的坐标**使用 x、y、z 三个『**向量**』作为空间的坐标系,可以在『**空间**』中唯一的定位到一个『**点**』。
**Maven中的坐标**使用三个『**向量**』在『**Maven的仓库**』中**唯一**的定位到一个『**jar**』包。
- **groupId**:公司或组织的 id即公司或组织域名的倒序通常也会加上项目名称
例如groupIdcom.tofacebook.maven
- **artifactId**:一个项目或者是项目中的一个模块的 id即模块的名称将来作为 Maven 工程的工程名就是module的名称
例如artifactIdauth
- **version**:版本号
例如version1.0.0
提示:坐标和仓库中 jar 包的存储路径之间的对应关系,如下
```javascript
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
```
复制
上面坐标对应的 jar 包在 Maven 本地仓库中的位置:
```javascript
Maven本地仓库根目录\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar
```
复制
### 3.2 pom.xml
POM**P**roject **O**bject **M**odel项目对象模型。和 POM 类似的是DOMDocument Object Model文档对象模型。它们都是模型化思想的具体体现。
POM 表示将工程抽象为一个模型,再用程序中的对象来描述这个模型。这样我们就可以用程序来管理项目了。我们在开发过程中,最基本的做法就是将现实生活中的事物抽象为模型,然后封装模型相关的数据作为一个对象,这样就可以在程序中计算与现实事物相关的数据。
POM 理念集中体现在 Maven 工程根目录下 **pom.xml** 这个配置文件中。所以这个 pom.xml 配置文件就是 Maven 工程的核心配置文件。其实学习 Maven 就是学这个文件怎么配置,各个配置有什么用。
```javascript
<!-- 当前Maven工程的坐标 -->
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<!-- 当前Maven工程的打包方式可选值有下面三种 -->
<!-- jar表示这个工程是一个Java工程 -->
<!-- war表示这个工程是一个Web工程 -->
<!-- pom表示这个工程是管理其他工程的工程 -->
<packaging>jar</packaging>
<properties>
<!-- 工程构建过程中读取源码时使用的字符集 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 当前工程所依赖的jar包 -->
<dependencies>
<!-- 使用dependency配置一个具体的依赖 -->
<dependency>
<!-- 在dependency标签内使用具体的坐标依赖我们需要的一个jar包 -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- scope标签配置依赖的范围 -->
<scope>test</scope>
</dependency>
</dependencies>
```
复制
### 3.3 依赖
上面说到我们使用 Maven 最主要的就是使用它的依赖管理功能引入依赖存在一个范围maven的依赖范围包括 `compile``provide``runtime``test``system`。
- **compile**:表示编译范围,指 A 在编译时依赖 B该范围为**默认依赖范围**。编译范围的依赖会用在编译,测试,运行,由于运行时需要,所以编译范围的依赖会被打包。
- **provided**provied 依赖只有当 jdk 或者一个容器已提供该依赖之后才使用。provide 依赖在编译和测试时需要在运行时不需要。例如servlet api被Tomcat容器提供了。
- **runtime**runtime 依赖在运行和测试系统时需要但在编译时不需要。例如jdbc 的驱动包。由于运行时需要,所以 runtime 范围的依赖会被打包。
- **test**test 范围依赖在编译和运行时都不需要只在测试编译和测试运行时需要。例如Junit。由于运行时不需要所以 test 范围依赖不会被打包。
- **system**system 范围依赖与 provide 类似,但是必须显示的提供一个对于本地系统中 jar 文件的路径。一般不推荐使用。
| 依赖范围 | 编译 | 测试 | 运行时 | 是否会被打入jar包 |
| :------- | :--- | :--- | :----- | :---------------- |
| compile | √ | √ | √ | √ |
| provided | √ | √ | × | × |
| runtime | × | √ | √ | √ |
| test | × | √ | × | × |
| system | √ | √ | × | √ |
而在实际开发中,我们常用的就是 `compile`、`test`、`provided` 。
### 3.4 依赖的传递
A 依赖 BB 依赖 C那么在 A 没有配置对 C 的依赖的情况下A 里面能不能直接使用 C
再以上的前提下C 是否能够传递到 A取决于 B 依赖 C 时使用的依赖范围。
- B 依赖 C 时使用 compile 范围:可以传递
- B 依赖 C 时使用 test 或 provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以。
### 3.5 依赖的排除
当 A 依赖 BB 依赖 C 而且 C 可以传递到 A 的时候A 不想要 C需要在 A 里面把 C 排除掉。而往往这种情况都是为了避免 jar 包之间的冲突。
![img](https://ask.qcloudimg.com/http-save/yehe-9415984/437f69a4e38e1919576b398b962bc169.png?imageView2/2/w/2560/h/7000)
所以配置依赖的排除其实就是阻止某些 jar 包的传递。因为这样的 jar 包传递过来会和其他 jar 包冲突。
一般通过使用`excludes`标签配置依赖的排除:
```javascript
<dependency>
<groupId>net.javatv.maven</groupId>
<artifactId>auth</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
<!-- 使用excludes标签配置依赖的排除 -->
<exclusions>
<!-- 在exclude标签中配置一个具体的排除 -->
<exclusion>
<!-- 指定要排除的依赖的坐标不需要写version -->
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
```
复制
### 3.6 继承
#### 3.6.1 概念
Maven工程之间A 工程继承 B 工程
- B 工程:父工程
- A 工程:子工程
本质上是 A 工程的 pom.xml 中的配置继承了 B 工程中 pom.xml 的配置。
#### 3.6.2 作用
在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本。
它的背景是:
- 对一个比较大型的项目进行了模块拆分。
- 一个 project 下面,创建了很多个 module。
- 每一个 module 都需要配置自己的依赖信息。
它背后的需求是:
- 在每一个 module 中各自维护各自的依赖信息很容易发生出入,不易统一管理。
- 使用同一个框架内的不同 jar 包,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一。
- 使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。
通过在父工程中为整个项目维护依赖信息的组合既**保证了整个项目使用规范、准确的 jar 包**;又能够将**以往的经验沉淀**下来,节约时间和精力。
参考:
https://blog.ideaopen.cn