1、Maven的简介和安装
Maven是一个基于Java的开源项目管
目录
理和构建工具,它主要用于帮助Java开发人员自动化构建、依赖管理和项目生命周期管理。(注:Maven只能管理Java的项目)Maven通过其强大的功能和灵活的插件系统,极大地简化了项目的构建和管理过程,提高了开发效率和项目的可维护性。
简单来说Maven就是用来管理依赖和构建项目的
Maven的安装也很简单,我们直接去官网下载
Maven官网下载地址:Maven – Download Apache Maven
我是下载3.8.6的
下载完Maven后,有两个重要的操作,一个就是配置环境变量一个就是修改配置文件
1.1配置Maven的环境变量
Maven配置环境变量的原因主要有三个
-
全局访问:配置环境变量后,Maven的命令(如mvn)可以在操作系统的任何目录下被识别和执行。这是因为环境变量中的PATH项会告诉操作系统在哪些目录下查找可执行文件。当Maven的bin目录被添加到PATH环境变量中后,无论当前工作目录在哪里,都可以直接通过mvn命令来调用Maven。
-
便于集成开发环境(IDE):虽然许多集成开发环境(如Eclipse、IntelliJ IDEA等)都内置了对Maven的支持,但它们也通常会依赖系统环境变量来定位Maven的安装目录和配置文件。配置环境变量可以确保IDE能够正确地与Maven集成。
-
简化构建流程:配置环境变量后,开发人员无需每次构建项目时都指定Maven的安装路径,从而简化了构建流程。
第一步:下载完Maven之后我们把它解压放在无中文目录,复制bin目录的上级目录
D:\idea-code\software\maven\apache-maven-3.8.6D:\idea-code\software\maven\apache-maven-3.8.6
第二步:电脑——系统——系统信息——高级系统设置——环境变量——新建系统变量
变量名输入:MAVEN_HOME
变量值输入:你复制的Maven路径值(如D:\idea-code\software\maven\apache-maven-3.8.6)
第三步:配置完Maven_Home之后,我们需要去让它生效
在系统变量找到Path,点进去,然后点击新建,然后输入%MAVEN_HOME%\bin,这一步是为了让配置生效
第四步:之后我们就可以win+r,输入cmd,在控制台输入mvn -v查看环境配置是否生效,如果显示版本就是生效
1.2修改Maven的配置文件
Maven配置主要要修改三个东西
镜像下载地址、本地仓库地址、jdk版本
第一步:修改镜像
目的:Maven的默认中央仓库位于国外,由于网络延迟和带宽限制,国内用户从中央仓库下载依赖包时可能会遇到下载速度慢或连接失败的问题。通过修改Maven的配置文件(通常是settings.xml),将默认的中央仓库地址替换为国内镜像地址(如阿里云Maven镜像、华为云Maven镜像等),可以显著提高依赖包的下载速度。
步骤:在Maven的解压文件中,存在一个conf文件夹,里面有个名为settings.xml的配置文件
打开settings.xml的配置文件,在<mirrors></mirrors>中添加如下镜像(阿里云镜像)
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyunMaven</name>
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
第二步:修改本地仓库
目的:在Maven中,仓库(Repository)扮演着非常重要的角色,它们用于存储项目所需的依赖(即其他库或框架的jar包等)。Maven仓库主要分为两种类型:本地仓库(Local Repository)和中央仓库(Central Repository)。本地仓库是Maven在本地机器上存储所有已下载的插件和依赖的仓库。当你使用Maven构建项目时,Maven首先会在本地仓库中查找所需的依赖。如果本地仓库中没有找到所需的依赖,Maven会尝试从配置的远程仓库(包括中央仓库)下载这些依赖,并将它们存储在本地仓库中供将来使用。本地仓库如果我们不修改,他默认是在c盘。我们可以把本地仓库放在任何一个不带中文的目录文件夹。
步骤:
还是打开settings.xml的配置文件,在<localRepository></localRepository>的标签中间放置我们本地仓库的地址
<localRepository>D:\idea-code\software\maven\maven-repository</localRepository>
第三步:指定JDK版本
目的:确保项目在指定的 JDK 版本下进行编译和运行。这有助于避免不同开发环境和构建环境之间的兼容性问题
步骤:还是打开settings.xml的配置文件,在 <profiles> </profiles>标签里输入以下代码,将JDK替换成你想要的版本
<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>
2、IDEA的Maven创建
第一步:启动 IntelliJ IDEA
打开 IntelliJ IDEA,点击 "New Project" 创建一个新项目。
第二步:选择项目类型
在 "Generators" 中选择 "Maven"。
第三步:填写信息,点击Next
- Name:填写项目名
- Location:代码存放的本地地址
- JDK:项目需要的JDK
- Catalog:默认
- Archetype:archetype
- GroupId:通常是你的组织名称或域名反转,如 com.example 。
- ArtifactId:项目的名称,如 my-app 。
- Version:项目的版本,默认为 1.0-SNAPSHOT 。
第四步:在IDEA设置项目Maven版本
点击file——settings——Build,Execution,Deployment——Build Tools——Maven
Maven home path:选择你的Maven解压路径 例如:
D:\idea-code\software\maven\apache-maven-3.8.6
User settings file:选择之前修改的配置文件例如:
D:\idea-code\software\maven\apache-maven-3.8.6\conf\settings.xml
Local repository:选择你在配置文件设置的本地仓库
最后点击ok,Maven项目就创建好了
3、Maven核心功能
3.1依赖管理
什么是依赖管理:
依赖管理是 Maven 的一个核心功能,用于自动管理项目所需的库和插件。Maven 通过其依赖管理机制,简化了项目的依赖关系,避免了手动下载和配置库的麻烦
如何依赖管理:
Maven 使用 pom.xml 文件来定义项目的依赖。每个依赖都通过一组唯一的坐标来进行标识和管理。pom.xml 文件中包含了所有依赖的坐标(GroupId、ArtifactId、Version),以及它们的范围(Scope)。
GroupId: 是组织或项目的唯一标识符,通常使用反向域名来命名,例如 com.example 或 org.apache.maven.plugins 。
ArtifactId 是项目或依赖的名称。ArtifactId 用于标识具体的项目或依赖。在同一个 GroupId 下,ArtifactId 保证唯一性。
Version 是项目或依赖的版本号。用于管理依赖的版本控制。通过指定版本号,可以确保项目使用特定版本的依赖,避免版本不兼容问题。
Packaging 用于定义项目的打包类型,例如 jar 、war 、pom 等。决定了构建输出的格式。
传递性依赖:Maven 处理传递性依赖,即一个依赖项的依赖项也会被自动引入。例如:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.4</version>
</dependency>
spring-boot-starter-web 本身依赖于其他 Spring Boot 模块和第三方库,Maven 会自动处理这些传递性依赖。
依赖管理:在多模块项目中,可以使用 <dependencyManagement> 元素来集中管理依赖的版本。例如:在<properties></properties>设置版本号,<dependencyManagement> 中管理依赖,并用${}引用properties中设置的版本号
<properties>
<spring-version>6.0.6</spring-version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
</dependencies>
</dependencyManagement>
依赖冲突:项目A依赖库B,库B又依赖库C的某个版本,而项目A直接或间接依赖库C的不同版本。这会导致依赖冲突
解决:Maven 使用最近路径优先策略来解决依赖冲突。当存在多个版本的同一个依赖时,Maven 会选择离项目最近的那个版本。
示例:假设项目A有以下依赖关系:
<dependency>
<groupId>com.example</groupId>
<artifactId>B</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>C</artifactId>
<version>2.0.0</version>
</dependency>
库B和库C又有以下依赖:
库B依赖 com.example:D:1.0.0
库C依赖 com.example:D:2.0.0
根据最近路径优先策略,Maven 会选择依赖路径最短的版本。在这个示例中:
路径 A -> B -> D (1.0.0):路径长度为 2。
路径 A -> C -> D (2.0.0):路径长度为 2。
由于两个路径的长度相同,Maven 会按照 POM 文件中依赖声明的顺序进行选择。如果库 B 在 POM 文件中先于库 C 声明,那么 com.example:D:1.0.0 会被选择
3.2构建管理
构建管理是指如何编译、测试、打包和部署项目。Maven 提供了一个标准化的构建生命周期,包含一系列有序的阶段(Phases),每个阶段执行特定的任务
构建生命周期
Maven 的构建生命周期包括以下几个关键阶段:
validate:验证项目是否正确和所有必要信息是否可用。
compile:编译项目的源代码。
test:使用适当的单元测试框架(如 JUnit)测试编译好的代码。
package:将编译后的代码打包成可分发的格式(如 JAR、WAR)。
verify:运行任何集成测试来验证软件包的有效性。
install:将软件包安装到本地 Maven 仓库,以供本地项目使用。
deploy:将最终的构建结果复制到远程仓库,以供其他开发人员和项目共享。
4、Maven的继承
子项目可以继承父项目的配置。通过继承机制,子项目可以复用父项目定义的依赖、插件、属性等配置,减少重复配置,提高项目的可维护性。
我们可以在创建项目的时候,在parent,勾选要继承的父项目
在配置文件的<parent></parent>标签里可以看见项目继承的Maven
继承之后,父项目可以集中定义所有子项目共享的配置,如依赖、插件、属性等。
减少了在每个子项目中重复配置的需要,增强了配置的一致性和可维护性。同时,通过继承,父项目可以定义统一的构建过程和生命周期。所有子项目在构建时都会遵循相同的流程,确保构建的一致性和完整性。
5、Maven的聚合
聚合是指在一个父项目中管理多个子项目,使得构建和管理多个模块变得更加方便。
在聚合项目的根目录中运行 Maven 命令,可以同时构建和管理所有子项目。例如:
mvn clean install,这将清理并构建聚合项目及其所有子项目
聚合项目(Aggregator Project)本身通常不包含代码,仅用于组织和管理子项目
聚合项目的 POM 文件通过 <modules> 元素定义了包含的子项目。通过聚合,可以一次性构建和管理所有子项目。简化了构建和发布过程。
6、项目实战
需求:搭建一个电商平台,该平台包括用户模块、订单模块、通用模块。然后用Maven统一管理这些模块的依赖。
用户模块需要的依赖:
- jackson-databind 2.15.0
- spring-beans 6.0.6
- spring-core 6.0.6
- spring-context 6.0.6
订单模块需要的依赖:
- shiro-core 1.10.1
- spring-beans 6.0.6
- spring-core 6.0.6
- spring-context 6.0.6
通用模块需要的依赖:
- commons-io 2.11.0
分析:
- 通过上面依赖关系我们可以看到订单模块和用户模块,有通用的依赖spring-beans 6.0.6 spring-core 6.0.6 spring-context 6.0.6,我们可以创建父项目中统一去管理
- 订单模块和用户模块,可以继承创建的父模块
- 父项目可以聚合通用模块
- 在spring-beans 6.0.6 spring-core 6.0.6 spring-context 6.0.6这三个依赖可以相互传递,只声明一个依赖即可
因此:
Maven-main-shop的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.swiftpass</groupId>
<artifactId>maven-main-shop</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<!-- maven-main-shop聚合了三个服务,方便统一管理构建-->
<modules>
<module>user-service</module>
<module>order-service</module>
<module>common-service</module>
</modules>
<!-- 在父项目中进行版本管理,并没有引入依赖,子项目引用就好了。方便后续版本更新-->
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-version>6.0.6</spring-version>
<jackson-version>2.15.0</jackson-version>
<shiro-version>1.10.1</shiro-version>
<io-version>2.11.0</io-version>
</properties>
<!-- 父项目进行依赖管理,避免依赖冲突-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro-version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${io-version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
user-service的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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.swiftpass</groupId>
<artifactId>maven-main-shop</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.swiftpass</groupId>
<artifactId>user-service</artifactId>
<version>1.0.1</version>
<packaging>war</packaging>
<name>Archetype - user-service</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
</project>
order-service的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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.swiftpass</groupId>
<artifactId>maven-main-shop</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.swiftpass</groupId>
<artifactId>order-service</artifactId>
<version>1.0.1</version>
<packaging>war</packaging>
<name>Archetype - order-service</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>
</project>
common-service的pom.xml文件应该为
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.swiftpass</groupId>
<artifactId>maven-main-shop</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.swiftpass</groupId>
<artifactId>common-service</artifactId>
<version>1.0.1</version>
<name>Archetype - common-service</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
</dependencies>
</project>