Maven使用(最全总结)

文章目录

Maven 使用教程1.安装 Maven2.Maven 项目结构3.理解 `pom.xml` 文件4.详解依赖的属性4.1 依赖范围4.2 依赖可选4.3 依赖排除

5.Maven 仓库5.1 自定义本地仓库地址5.2 Maven 镜像设置5.3 搜索第三方组件

6.Maven 常见命令7.Maven 常用 POM 属性8.在 IDEA 中配置 Maven9.导入 Maven 项目10.Maven 生命周期11.mvnw12.`pom.xml` 文件示例13.Maven 常见问题解决参考

Maven 使用教程

Maven 是一个项目管理与构建自动化工具。它的主要功能有:

依赖管理:Maven 能帮助我们解决软件包依赖的管理问题,不再需要提交大量的 jar 包、引入第三方库;规范目录结构:Maven 标准的目录结构有助于项目构建的标准化,通过配置 profile 还可以根据不同的环境(开发环境、测试环境,生产环境)读取不同的配置文件;方便集成:能够集成在 IDE 中更方便使用。

1.安装 Maven

进入官网 Downloading Apache Maven 下载 Maven 压缩包,并解压。

设置环境变量。

在「环境变量」->「系统变量」->「新建」,创建 M2_HOME 变量。

在「环境变量」->「系统变量」->「path」->「编辑」->「新建」,粘贴 %M2_HOME%\bin。

打开命令行窗口,输入 mvn -version,如果看到 Maven 的版本信息,则表示配置成功。

2.Maven 项目结构

一个使用 Maven 管理的普通的 Java 项目,它的目录结构默认如下:

a-maven-project ├── pom.xml ├── src │ ├── main │ │ ├── java │ │ └── resources │ └── test │ ├── java │ └── resources └── target

项目的根目录 a-maven-project 是项目名,它有一个项目描述文件 pom.xml,存放 Java 源码的目录是 src/main/java,存放资源文件的目录是 src/main/resources,存放测试源码的目录是 src/test/java,存放测试资源的目录是 src/test/resources,最后,所有编译、打包生成的文件都放在 target 目录里。这些就是一个 Maven 项目的标准目录结构。

note:所有的目录结构都是约定好的标准结构,千万不要随意修改目录结构。使用标准结构不需要做任何配置,Maven 就可以正常使用。

3.理解 pom.xml 文件

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">

4.0.0

org.example

MavenDemo

0.0.1-SNAPSHOT

MavenDemo

第一行是 XML 头,指定了该 xml 文档的版本和编码方式。project 是根元素,声明了一些 POM 相关的命名空间及 xsd 元素。modelVersion 指定了当前 POM 的版本,对于 Maven 3 来说,值只能是 4.0.0。groupId 定义了项目属于哪个组织,通常是域名反写,例如 com.itheima。artifactId 定义了项目在组织中的唯一 ID,类似于 Java 的类名,通常是模块名称,例如 order-service、good-service。version 指定了项目当前的版本,SNAPSHOT 意为快照,说明该项目还处于开发中。name 声明了一个对于用户更为友好的项目名称。

一个 Maven 工程就是由 groupId,artifactId 和 version 作为唯一标识。在引用其他第三方库的时候,也是通过这 3 个变量确定。例如,依赖 redis.clients:

redis.clients

jedis

8.0.0

使用 声明一个依赖后,Maven 就会自动下载这个依赖包并把它放到 classpath 中。

另外, 定义了一些属性,常用的属性有:

8

8

8

UTF-8

project.build.sourceEncoding:表示项目源码的字符编码,通常应设定为 UTF-8;maven.compiler.release:表示使用的 JDK 版本,例如 21;maven.compiler.source:表示 Java 编译器读取的源码版本;maven.compiler.target:表示 Java 编译器编译的 Class 版本。

通过 定义的属性,就可以固定 JDK 版本,防止同一个项目的不同的开发者各自使用不同版本的 JDK。

4.详解依赖的属性

...

实际项目

模块

版本

依赖类型

依赖范围

依赖是否可选

...

dependencies 可以包含一个或者多个 dependency 元素,以声明一个或者多个项目依赖。grounpId、artifactId和version 组成了依赖的基本坐标。type 指定了依赖的类型,默认为 jar。scope 指定了依赖的范围。optional 标记了依赖是否是可选的。exclusions 用来排除传递性依赖。

4.1 依赖范围

Maven 定义了几种依赖关系,分别是 compile、test、runtime 和 provided:

scope说明示例compile编译时需要用到该 jar 包(默认)commons-loggingtest编译 Test 时需要用到该 jar 包junitruntime编译时不需要,但运行时需要用到mysqlprovided编译时需要用到,但运行时由 JDK 或某个服务器提供servlet-api

默认的 compile 是最常用的,Maven 会把这种类型的依赖直接放入 classpath。

test 依赖表示仅在测试时使用,正常运行时并不需要。最常用的 test 依赖就是 JUnit:

org.junit.jupiter

junit-jupiter-api

5.3.2

test

runtime 依赖表示编译时不需要,但运行时需要。最典型的 runtime 依赖是 JDBC 驱动,例如 MySQL 驱动:

mysql

mysql-connector-java

5.1.48

runtime

provided 依赖表示编译时需要,但运行时不需要。最典型的 provided 依赖是 Servlet API ,编译的时候需要,但是运行时,Servlet 服务器内置了相关的 jar,所以运行期不需要:

jakarta.servlet

jakarta.servlet-api

4.0.0

provided

4.2 依赖可选

传递性依赖:当一个项目(模块、库等)依赖于另一个项目,而被依赖的项目又依赖于其他项目时,这些间接的依赖关系就被称为传递性依赖。也就是说,若项目 A 依赖项目 B,项目 B 又依赖项目 C,那么项目 C 就是项目 A 的传递性依赖。

项目中 A 依赖 B,B 依赖于 X 和 Y,如果所有这三个的范围都是 compile 的话,那么 X 和 Y 就是 A 的 compile 范围的传递性依赖,但是如果想 X、Y 不作为 A 的传递性依赖,不给它用的话,可以按照下面的方式配置可选依赖:

4.0.0

org.example

Learn

1.0-SNAPSHOT

mysql

mysql-connector-java

5.1.10

true

postgresql

postgresql

8.4-701.jdbc3

true

4.3 依赖排除

有时候引入的依赖中包含你不想要的依赖包,你想引入自己想要的,这时候就要用到依赖排除了,比如 spring-boot-starter-web 自带了 logback 这个日志包,我们想引入 log4j2 的,所以先排除掉 logback 的依赖包,再引入想要的包就可以了。

org.springframework.boot

spring-boot-starter-web

2.5.6

org.springframework.boot

spring-boot-starter-logging

org.springframework.boot

spring-boot-starter-log4j2

2.5.6

5.Maven 仓库

本地仓库:是 Maven 在本地计算机上存储构件的地方。当 Maven 从远程仓库下载构件时,会先将其存储在本地仓库,以便下次使用时直接从本地获取,加快构建速度。默认情况下,本地仓库位于用户目录下的 .m2/repository 目录中。远程仓库:位于网络上的服务器,用于存储各种构件。当本地仓库中没有所需的构件时,Maven 会从远程仓库下载。远程仓库可以分为以下几种:

中央仓库:由 Maven 社区维护的公共仓库,包含了大量的流行开源项目的构件。Maven 默认会从中央仓库下载构件,其地址是 https://repo.maven.apache.org/maven2/。私服:是在企业内部搭建的私有 Maven 仓库。它可以代理远程仓库,缓存常用的构件,减少对外部网络的依赖,提高构建速度,同时也可以用于存储企业内部的私有构件。第三方仓库:除了中央仓库和私服之外的其他远程仓库。一些开源项目可能会有自己的独立仓库,或者企业可能会使用一些特定的商业仓库,这些都属于第三方仓库。在使用第三方仓库时,需要在 Maven 项目的配置中明确指定仓库的地址。

5.1 自定义本地仓库地址

找到 settings.xml 文件:

在 Maven 安装目录下的 conf 文件夹里,会有一个名为 settings.xml 的文件,这是全局的配置文件。也可以在用户目录(例如 Windows 系统下的 C:\Users\用户名\.m2)下创建或修改 settings.xml 文件,这个文件的配置会覆盖全局配置。 编辑 settings.xml 文件:

打开 settings.xml 文件,找到 标签。把标签内的值修改为期望的本地仓库目录地址。

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

D:/maven/repo

5.2 Maven 镜像设置

如果访问 Maven 的中央仓库非常慢,我们可以选择一个速度较快的 Maven 的镜像仓库。

在用户主目录下进入 .m2 目录,创建或打开 settings.xml 文件,在 标签中添加 mirror 子节点:

aliyunmaven

central

阿里云公共仓库

https://maven.aliyun.com/repository/public

其他镜像地址:

华为云:https://repo.huaweicloud.com/repository/maven/

清华大学:https://repo.maven.apache.org/maven2/

中科院:http://maven.opencas.cn/maven/

5.3 搜索第三方组件

如果我们要引用一个第三方组件,比如 gson,如何确切地获得它的 groupId、artifactId 和 version?方法是通过提供仓库搜索服务的网站搜索关键字,找到对应的组件后,直接复制相应的信息。这里推荐 3 个提供仓库搜索服务的网站:

https://search.maven.org/https://central.sonatype.com/https://mvnrepository.com/

6.Maven 常见命令

mvn clean:表示运行清理操作(会默认把 target 文件夹中的数据清理)。mvn clean compile:表示先运行清理之后运行编译,会将代码编译到 target 文件夹中。mvn clean test:运行清理和测试。mvn clean package:运行清理和打包。mvn clean install:运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用。mvn clean deploy:运行清理和发布(发布到私服上面)。mvn help:effective-settings:查看 Maven 的有效配置信息。

7.Maven 常用 POM 属性

${project.build.sourceDirectory}:项目的主源码目录,默认为 src/main/java/${project.build.testSourceDirectory}:项目的测试源码目录,默认为 /src/test/java/${project.build.directory}:项目构建输出目录,默认为 target/${project.build.outputDirectory}:项目主代码编译输出目录,默认为 target/classes/${project.build.testOutputDirectory}:项目测试代码编译输出目录,默认为 target/testclasses/${project.groupId}:项目的 groupId.${project.artifactId}:项目的 artifactId.${project.version}:项目的 version,于 ${version} 等价${project.build.finalName}:项目打包输出文件的名称,默认为 ${project.artifactId}${project.version}

8.在 IDEA 中配置 Maven

9.导入 Maven 项目

方式一:「File」->「Project Structure」->「Modules」->「Import Module」-> 选择 maven 项目的 pom.xml

方式二:Maven 面板 -> +(Add Maven Projects) -> 选择 Maven 项目的 pom.xml

10.Maven 生命周期

Maven 的生命周期就是为了对所有的构建过程进行抽象和统一。描述了一次项目构建,经历哪些阶段。

Maven 对项目构建的生命周期划分为 3 套(相互独立):

clean:清理工作。default:核心工作。如:编译、测试、打包、安装、部署等。site:生成报告、发布站点等。

每套生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。在 同一套生命周期 中,当运行后面的阶段,前面的阶段都会运行。

11.mvnw

mvnw 是 Maven Wrapper 的缩写。因为我们安装 Maven 时,默认情况下,系统所有项目都会使用全局安装的这个 Maven 版本。但是,对于某些项目来说,它可能必须使用某个特定的 Maven 版本,这个时候,就可以使用 Maven Wrapper,它可以负责给这个特定的项目安装指定版本的 Maven,而其他项目不受影响。

简单地说,Maven Wrapper 就是给一个项目提供一个独立的,指定版本的 Maven 给它使用。

安装 Maven Wrapper:

安装 Maven Wrapper 最简单的方式是在项目的根目录(即 pom.xml 所在的目录)下运行安装命令:

mvn wrapper:wrapper

它会自动使用最新版本的 Maven。如果要指定使用的 Maven 版本,使用下面的安装命令指定版本,例如 3.9.0:

mvn wrapper:wrapper -Dmaven=3.9.0

安装后,查看项目结构:

my-project ├── .mvn │ └── wrapper │ └── maven-wrapper.properties ├── mvnw ├── mvnw.cmd ├── pom.xml └── src ├── main │ ├── java │ └── resources └── test ├── java └── resources

发现多了 mvnw、mvnw.cmd 和 .mvn 目录,我们只需要把 mvn 命令改成 mvnw 就可以使用跟项目关联的 Maven。

12.pom.xml 文件示例

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">

4.0.0

com.example

my-project

1.0.0

jar

My Project

A simple Java project.

http://example.com

org.junit.jupiter

junit-jupiter-api

5.8.2

test

org.junit.jupiter

junit-jupiter-engine

5.8.2

test

src/main/java

src/test/java

org.apache.maven.plugins

maven-compiler-plugin

3.8.1

11

11

13.Maven 常见问题解决

🐮🐴

参考

廖雪峰-Maven

Copyright © 2022 星辰幻想游戏活动专区 All Rights Reserved.