--- 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 nexus-aliyun central Nexus aliyun http://maven.aliyun.com/nexus/content/groups/public ``` ![maven-02](https://images.qweraq.com/images/image-20230422153346870.png) ### 1.5配置基础 JDK 版本 Java 工程使用的默认 JDK 版本是 1.5,`profile` 标签整个复制到 `settings.xml` 文件的 `profiles` 标签内 ```xml jdk-1.8 true 1.8 1.8 1.8 1.8 ``` ### 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,即公司或组织域名的倒序,通常也会加上项目名称 例如:groupId:com.tofacebook.maven - **artifactId**:一个项目或者是项目中的一个模块的 id,即模块的名称,将来作为 Maven 工程的工程名就是:module的名称 例如:artifactId:auth - **version**:版本号 例如:version:1.0.0 提示:坐标和仓库中 jar 包的存储路径之间的对应关系,如下 ```javascript javax.servlet servlet-api 2.5 ``` 复制 上面坐标对应的 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 类似的是:DOM(Document Object Model),文档对象模型。它们都是模型化思想的具体体现。 POM 表示将工程抽象为一个模型,再用程序中的对象来描述这个模型。这样我们就可以用程序来管理项目了。我们在开发过程中,最基本的做法就是将现实生活中的事物抽象为模型,然后封装模型相关的数据作为一个对象,这样就可以在程序中计算与现实事物相关的数据。 POM 理念集中体现在 Maven 工程根目录下 **pom.xml** 这个配置文件中。所以这个 pom.xml 配置文件就是 Maven 工程的核心配置文件。其实学习 Maven 就是学这个文件怎么配置,各个配置有什么用。 ```javascript com.example demo 0.0.1-SNAPSHOT demo Demo project for Spring Boot jar UTF-8 junit junit 4.12 test ``` 复制 ### 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 依赖 B,B 依赖 C,那么在 A 没有配置对 C 的依赖的情况下,A 里面能不能直接使用 C? 再以上的前提下,C 是否能够传递到 A,取决于 B 依赖 C 时使用的依赖范围。 - B 依赖 C 时使用 compile 范围:可以传递 - B 依赖 C 时使用 test 或 provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以。 ### 3.5 依赖的排除 当 A 依赖 B,B 依赖 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 net.javatv.maven auth 1.0.0 compile commons-logging commons-logging ``` 复制 ### 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