Author:Dawn_T17🥥
目录
一.Meven介绍
Maven 是一个项目管理和构建工具。
它主要用于 Java 项目,可以自动化项目的构建、依赖管理和项目部署等过程。
Maven 定义了一套标准化的项目结构和配置方式,使得开发人员能够更加方便和高效地管理项目。
1.依赖管理
通过在 pom.xml
文件中配置依赖,Maven 会自动下载所需的库和框架,并确保项目在不同的环境中都能正确构建。
Maven 通过在 pom.xml
文件中声明依赖的坐标(包括groupId、artifactId 和 version)来管理项目的依赖。以下是一些关键的优点和特点:
-
版本控制:可以精确指定依赖的版本,避免因版本不一致导致的问题。例如,如果项目依赖于
Spring Framework
的某个特定版本,如5.3.22
,通过明确声明这个版本,确保整个项目团队都使用相同的版本进行开发和测试。 -
依赖传递:当一个依赖本身又有其他依赖时,Maven 会自动处理这些传递性依赖。例如,引入一个
Web 开发框架
,它可能依赖于特定版本的数据库连接池
,Maven 会一并将这些相关依赖引入项目。 -
冲突解决:如果多个依赖之间存在版本冲突,Maven 会尝试按照一定的规则进行解决,通常会选择一个较新且兼容的版本。
-
依赖范围:可以为依赖指定不同的范围,如
compile
(编译时和运行时都需要)、test
(仅测试时需要)等,这有助于优化项目的构建和部署。 -
仓库管理:Maven 从中央仓库或自定义的私有仓库中获取依赖。开发者可以方便地配置仓库地址和访问权限。
-
更新和升级:可以轻松地更新依赖到新的版本,只需修改
pom.xml
中的版本号,然后重新构建项目
2.统一项目结构
因为不同的开发工具有着不同的项目结构,maven统一了项目结构
Maven 定义的典型项目结构通常包括以下几个主要部分:
src/main/java
:存放项目的主要 Java 源代码。src/main/resources
:用于放置项目运行时所需的资源文件,如配置文件、属性文件等。src/test/java
:包含项目的测试代码。src/test/resources
:存放测试相关的资源文件。
3.项目构建
Maven 通过一系列预定义的阶段和目标来执行项目的构建。主要包括以下几个关键步骤:
- 编译源代码:将
src/main/java
中的 Java 代码编译为字节码。 - 运行测试:执行
src/test/java
中的测试代码,确保代码的质量和功能的正确性。 - 打包:将编译后的代码和相关资源打包成一个可部署的构件,如 JAR(Java Archive)、 WAR(Web Application Archive)等。
- 安装:将构建好的构件安装到本地 Maven 仓库,以便其他项目可以引用。
在构建过程中,Maven 会根据 pom.xml
中的配置来处理依赖关系、插件配置等。
例如,一个简单的 Web 应用项目,Maven 会先编译 Java 代码和处理静态资源,然后运行针对服务层和控制器的测试用例。如果测试通过,会将项目打包成 WAR 文件,并可以将其部署到应用服务器上。
另外,Maven 还支持自定义构建配置。比如,可以通过配置插件来执行代码检查、生成文档、优化资源等额外的任务。
官网介绍:Apache Maven 是一个软件项目管理和理解工具。基于项目对象模型的概念 (POM),Maven 可以从一个中心信息来管理项目的构建、报告和文档。
TIP
“POM” 常见的是指 “Project Object Model”(项目对象模型)。
在 Maven 项目中,pom.xml
是 Maven 的核心配置文件,它定义了项目的基本信息、依赖、插件、构建配置等重要内容。
以下是 pom.xml
中的一些常见配置和其作用:
<groupId>
:定义项目所属的组织或团体的唯一标识符。<artifactId>
:项目的唯一标识符,在所属的groupId
范围内是唯一的。<version>
:项目的版本号。<dependencies>
:声明项目所依赖的其他库或框架。<build>
:包含构建相关的配置,如插件的使用、编译选项等。
Maven的工作过程
因为从 中央仓库下载jar包要联网,且Apache服务器在国外,下载速度慢。
项目开发时会使用公司的私服(远程仓库)
Maven的安装
通过连接阿里云私服提高下载速度
emmmmm......
修改核心文件settings.xml,添加阿里云下载网址时候,标签没有闭合。。。。。。。。
导致之后idea,老是爆红——显示xml文件格式不对。。。。
囧(nnd搞了2个小时才发现。。谁能想到是这个错误啊,低幼)
最后也是成功导入了Maven插件
并成功输出了“Hello Maven”
编译后左侧会多出一个target文件夹
target
文件夹是 Maven 构建过程中生成的输出目录。
它包含了各种构建产物,例如:
-
编译后的字节码文件(
.class
文件)。 -
打包生成的 JAR、WAR 等文件。
-
测试报告。
-
资源处理后的结果。
Maven坐标
Maven 坐标(Maven Coordinate)是用于唯一标识 Maven 项目的一组信息,它由三个主要部分组成:groupId、artifactId 和 version。
-
groupId
:通常是项目的组织或公司的反向域名,用于对项目进行分组和分类。例如,org.apache
、com.example
。 -
artifactId
:项目的名称。它在给定的groupId
内是唯一的。例如,maven
、my-library
。 -
version
:项目的版本号。用于区分项目的不同发布版本,例如1.0.0
、2.1.5-SNAPSHOT
。
通过这三个部分的组合,可以精确地指定和引用一个特定的 Maven 项目。
例如,org.springframework:spring-webmvc:5.3.23
就是一个 Maven 坐标,它表示 groupId
为 org.springframework
,artifactId
为 spring-webmvc
,版本为 5.3.23
的项目。
开发一个项目的时候,需要引入一个第三方库,只要知道这个库的 Maven 坐标,然后在 pom.xml
文件中进行配置,Maven 就能自动下载和管理这个依赖。
二.Maven新项目的导入
前提
首先要把需要导入的maven项目 放到对应磁盘下
法一
法二
三.Maven依赖管理
1.依赖配置
groupId
:定义了依赖库所属的组织或项目组的唯一标识符。artifactId
:依赖库的唯一名称。version
:指定依赖库的具体版本。
Maven 会根据这些配置信息从 Maven 中央仓库(或者您配置的其他仓库)下载所需的依赖,并将其添加到项目的类路径中,以便在项目中使用。
每次添加完依赖,都要“刷新”一下
依赖配置完成,右侧Maven面板能看到
2.依赖传递
依赖传递是 Maven 中一个重要的特性。
当一个项目依赖于某个库(称为直接依赖),而这个库又依赖于其他库(称为间接依赖)时,Maven 会自动将间接依赖引入到项目中,这就是依赖传递。
例如,项目 A 依赖于库 B,而库 B 又依赖于库 C。在配置项目 A 的 pom.xml
时,只明确声明了对 B 的依赖,但由于依赖传递,Maven 会自动将库 C 也引入到项目 A 的依赖中。
依赖传递有助于减少开发者手动配置依赖的工作量,同时也确保了项目中所使用的库之间的版本一致性。
然而,有时依赖传递可能会带来一些问题:
-
版本冲突:如果不同的直接依赖所传递的间接依赖存在不同的版本,可能会导致冲突。
比如项目同时依赖库 D 和库 E,D 传递了库 F 的 1.0 版本,E 传递了库 F 的 2.0 版本,就可能出现问题。 -
不必要的依赖:可能会引入一些项目实际上并不需要的间接依赖,从而增加项目的复杂性和潜在的风险。
为了处理这些问题,Maven 提供了一些机制:
<exclusions>
标签:可以在直接依赖的配置中排除某些不需要的间接依赖。
右击打开图标,可以看到依赖传递的的图表展示(有点类似于类的继承)
依赖排除(Dependency Exclusion)是 Maven 中用于处理依赖传递过程中不需要的间接依赖的一种机制。
在 Maven 项目的 pom.xml
文件中,当某个直接依赖引入了一些您不希望包含在项目中的间接依赖时,可以在导入这个依赖<dependency>标签里使用 <exclusions>
标签来进行排除。
3.依赖范围
依赖范围(Dependency Scope*在 Maven 中用于指定依赖在项目构建的不同阶段(如编译、测试、运行等)的有效性。
<scope>标签
4.生命周期
Maven 生命周期是 Maven 构建项目的一系列阶段和步骤的有序集合。
Maven 主要包含以下三个基本的生命周期:
-
用于清理项目,包含两个主要阶段:clean
生命周期:clean
:删除项目的生成目录,例如target
目录。pre-clean
:执行一些在清理之前需要完成的工作。
-
这是 Maven 最核心的生命周期,包含了从项目编译、测试、打包到部署的整个过程。主要阶段有:default
生命周期:deploy
:将项目部署到远程仓库。install
:将项目安装到本地 Maven 仓库,供其他项目依赖使用。verify
:对集成测试的结果进行检查,以确保满足质量标准。package
:将编译后的代码打包成可分发的格式,如 JAR、WAR 等。test
:运行测试用例。test-compile
:编译测试代码。compile
:编译项目的源代码。validate
:验证项目配置是否正确。
-
用于生成项目的站点文档,主要阶段有:site
生命周期:site-deploy
:将生成的站点文档部署到指定的服务器。post-site
:在生成站点文档之后执行的一些后续处理。site
:生成项目的站点文档。pre-site
:在生成站点文档之前执行的一些准备工作。
每个阶段都由一个或多个 Maven 插件的目标(goal)来实现。
例如,在 compile
阶段,Maven 会调用相应的编译器插件来编译源代码。
当您在命令行中运行 mvn install
时,Maven 会按照 default
生命周期的顺序依次执行到 install
阶段的所有默认阶段(之前的所有生命周期都要经历)
tip:clean不会,因为clean()不是default生命周期
假设您正在开发一个 Java Web 应用,当您运行 mvn package
命令时,Maven 会依次执行 validate
、compile
、test-compile
、test
等阶段,直到完成 package
阶段,将项目打包成 WAR 文件。
右侧Maven面板有相关操作指令