文章目录
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">
第一行是 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:
使用
另外,
project.build.sourceEncoding:表示项目源码的字符编码,通常应设定为 UTF-8;maven.compiler.release:表示使用的 JDK 版本,例如 21;maven.compiler.source:表示 Java 编译器读取的源码版本;maven.compiler.target:表示 Java 编译器编译的 Class 版本。
通过
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:
runtime 依赖表示编译时不需要,但运行时需要。最典型的 runtime 依赖是 JDBC 驱动,例如 MySQL 驱动:
provided 依赖表示编译时需要,但运行时不需要。最典型的 provided 依赖是 Servlet API ,编译的时候需要,但是运行时,Servlet 服务器内置了相关的 jar,所以运行期不需要:
4.2 依赖可选
传递性依赖:当一个项目(模块、库等)依赖于另一个项目,而被依赖的项目又依赖于其他项目时,这些间接的依赖关系就被称为传递性依赖。也就是说,若项目 A 依赖项目 B,项目 B 又依赖项目 C,那么项目 C 就是项目 A 的传递性依赖。
项目中 A 依赖 B,B 依赖于 X 和 Y,如果所有这三个的范围都是 compile 的话,那么 X 和 Y 就是 A 的 compile 范围的传递性依赖,但是如果想 X、Y 不作为 A 的传递性依赖,不给它用的话,可以按照下面的方式配置可选依赖:
4.3 依赖排除
有时候引入的依赖中包含你不想要的依赖包,你想引入自己想要的,这时候就要用到依赖排除了,比如 spring-boot-starter-web 自带了 logback 这个日志包,我们想引入 log4j2 的,所以先排除掉 logback 的依赖包,再引入想要的包就可以了。
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">
5.2 Maven 镜像设置
如果访问 Maven 的中央仓库非常慢,我们可以选择一个速度较快的 Maven 的镜像仓库。
在用户主目录下进入 .m2 目录,创建或打开 settings.xml 文件,在
其他镜像地址:
华为云: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">
13.Maven 常见问题解决
🐮🐴
参考
廖雪峰-Maven