一、Maven简介
什么是Maven
Maven是一个建管理和依赖管理工具,主要用于Java项目。
基于POM(Project Object Model)的概念,Maven 可以对项目的构建、报告和文档进行集中化管理。
Maven项目中的核心文件是POM(Project Object Model,项目对象模型)文件,文件名为pom.xml。在这个文件中,开发人员可以定义项目的基本信息、依赖关系以及相关的构建任务和插件。Maven会根据pom.xml文件的定义来执行相应的构建任务。
Maven的作用
使用Maven可以自动化构建、测试、打包和发布Java项目。
- 项目构建: Maven自动化Java项目的构建过程。它根据预定的生命周期并执行各个生命周期阶段的任务,实现编译、测试、打包等,并确保构建的一致性和可重复性。
- 依赖管理: Maven根据pom.xml文件的依赖信息自动下载和管理库和框架。它规范了依赖解析和库搜索过程,避免了版本冲突和传递问题。
- 项目信息管理: Maven利用pom.xml文件描述的项目信息生成报告和文档。这提高了项目的可读性和可维护性。
- 插件及扩展: Maven通过插件系统实现高度可扩展性。插件增强项目功能,如代码生成、代码质量检查、测试报告等。
- 多模块项目支持: Maven支持创建多模块项目,简化大型项目的组织和管理。多模块项目共享依赖、插件和属性配置,方便项目配置和维护。
- 持续集成: Maven与各种持续集成工具(如Jenkins、Travis CI等)相结合,实现项目的自动化构建、测试和部署等,有助于提高项目的质量和交付速度。
二、Maven的安装和配置
- 下载和安装Maven 从 maven官网 下载Maven发行版,并将其解压缩到本地计算机的目录中。在下载页面中,选择下载最新的稳定版本。
- 配置环境变量 将Maven添加到系统的PATH环境变量中
- 测试Maven安装
使用
mvn -v
测试是否安装成功。
三、Maven的项目结构
Maven 项目结构
Maven的目录结构是一种标准的结构,用于组织Maven项目中的源代码、资源文件和构建输出。
代码语言:javascript复制<project root>
├─src
│ ├─main
│ │ ├─java # 存放主要的Java源代码
│ │ ├─resources # 存放主要的资源文件
│ │ ├─webapp # Web应用程序的根目录
│ │ └─filters # 过滤文件目录
│ └─test
│ ├─java # 存放测试代码
│ └─resources # 存放测试资源文件
├─target # 存放构建输出文件
├─pom.xml # 项目构建的核心配置文件
└─README.md # 项目的说明文档
POM文件(pom.xml)介绍
pom.xml是项目的核心配置文件,用于定义项目的基本信息、依赖关系以及构建过程中的各种任务和插件。
- 项目元素:GAVP属性
- groupId:项目组ID,用于唯一标识项目的名称空间,通常与公司或组织的域名反转相同。
- artifactId:项目工件ID,用于标识具体的项目模块或产物,一般用名称或描述性的文字表示。
- version:项目版本号,用于区分不同版本的项目或模块。
- packaging:打包类型,指定项目构建输出的文件类型,常见的类型有JAR、WAR、EAR、POM等。
- 依赖元素
- dependencies:依赖关系的元素,用于声明项目所需的库和框架依赖。每个依赖都包含组ID、工件ID和版本号等信息,还可以包含其他元素,例如依赖范围、依赖传递等。
- 构建元素
- build:构建元素,包含了项目的构建信息和构建过程中的各种任务。
- plugins:插件元素,允许使用Maven的插件系统增强构建过程。每个插件包含插件组ID、插件工件ID、版本号和配置信息等。
- profiles:环境配置元素,根据不同的环境为项目进行不同的构建设置。
- 属性元素
- properties:属性元素,定义了一组全局属性,可在POM中引用。使用属性元素可以避免硬编码和重复定义的问题,提高了POM文件的可维护性和可读性。
这些元素定义了Maven项目的基本信息、依赖关系和构建过程中的各种配置。
在实际应用中,Maven使用pom.xml文件完成依赖管理、生命周期管理和插件管理等功能,为Java项目的构建和管理提供了方便和高效。
四、Maven的依赖管理
依赖管理是Maven的一个核心特性,它提供一种规范的方式来定义依赖项,自动地下载这些依赖项,以及解决依赖项之间的冲突。
依赖管理可以避免手动下载和安装依赖项所带来的问题,并简化了项目构建和开发的流程。
依赖声明
在pom.xml中使用元素声明项目所需的依赖项。
依赖项通常包含groupId、artifactId和version元素,用于唯一标识一个库或框架的版本。
代码语言:javascript复制<dependencies>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
可以使用元素指定依赖项的使用范围,常用的值包括compile、test和provided等。
依赖传递
Maven使用依赖传递机制来解决依赖项之间的冲突,使得项目能够兼容不同版本的依赖项,并确保每个依赖项的库和框架最终都能被加载并运行。
依赖传递机制是递归的,当一个库或框架被依赖时,它的依赖项也会被自动地解决和下载。
依赖范围
使用元素可以指定依赖项的使用范围,这决定了Maven在构建过程中如何处理依赖项。
常用的依赖范围包括compile、test、provided、runtime等。
不同的依赖范围可以用于区分编译时依赖、测试依赖和运行时依赖等。
依赖排除
•在元素中使用元素可以指定排除依赖项中的某些依赖项。
依赖排除应谨慎使用。
五、Maven的构建生命周期
Maven生命周期是一种定义了一系列构建过程的标准步骤,它规定了Maven在项目构建过程中执行的操作和顺序。
Maven分为三个生命周期,分别为:
- clean生命周期
- default生命周期
- site生命周期。
clean生命周期
clean生命周期是用来清理项目目录的,包含了清理项目输出目录、清理测试输出目录、清理项目临时文件等操作。
执行命令“mvn clean”会使Maven执行clean生命周期。
default生命周期
default生命周期是构建项目的核心生命周期,包括了编译、测试、打包等操作。它有以下几个阶段:
Goal | Description |
---|---|
validate | 验证项目是否正确 |
initialize | 初始化构建参数 |
generate-sources | 生成源代码,如使用jpa向数据库生成实体类 |
process-sources | 编译源代码 |
generate-resources | 生成资源文件 |
process-resources | 处理资源文件 |
compile | 编译项目源代码 |
process-classes | 处理编译后的代码文件 |
generate-test-sources | 生成测试代码 |
process-test-sources | 处理测试代码 |
generate-test-resources | 生成测试用的资源文件 |
process-test-resources | 处理测试用的资源文件 |
test-compile | 编译测试用的代码 |
process-test-classes | 处理测试用的编译后的代码 |
test | 运行测试 |
prepare-package | 准备打包文件 |
package | 生成项目打包文件 |
pre-integration-test | 在集成测试之前执行的操作 |
integration-test | 执行集成测试 |
post-integration-test | 在集成测试之后执行的操作 |
verify | 验证项目是否正确 |
install | 将项目打包安装到本地Maven库中 |
deploy | 将项目打包部署到远程Maven仓库。 |
默认情况下,Maven执行到package阶段时会将源代码编译、测试、打包,并将包发布到本地Maven仓库中。执行命令“mvn package”会使Maven执行default生命周期,在完成所有阶段后,生成最终构建文件。
site生命周期。
site生命周期是用来生成项目文档和站点的,包括了生成HTML文档、生成静态站点等操作。执行命令“mvn site”会使Maven执行site生命周期。
总的来说,Maven生命周期可以帮助开发者自动化执行构建过程,提高构建效率和可靠性,并规范了Maven插件使用的标准流程,遵循生命周期规范的插件能降低配置的复杂度,提高构建过程执行的稳定性。
六、Maven的插件管理
插件简介
Maven插件管理是Maven的又一重要特性,它以插件为中心对Maven构建生命周期进行扩展,提供一些常用或特定的构建功能。
常用插件
Maven的插件分为内建插件和外部插件
- 内置插件:Maven内置,用以支持Maven构建的基本功能。
- 外部插件:从Maven中央仓库或其他仓库获取插件并使用。
下面是常用的几个内置插件:
- maven-compiler-plugin:Java代码的编译工具
- maven-jar-plugin:将项目打包为JAR文件
- maven-war-plugin:将项目打包为WAR文件
- maven-install-plugin:安装项目到本地Maven仓库
- maven-clean-plugin:清理项目目录
插件的使用
(1)插件引入
在Maven项目中,可以使用元素引入插件。每个插件包含插件组ID、插件工件ID、版本号和配置信息等。一旦插件被引入,它就可以在项目构建过程的不同阶段中进行执行。
代码语言:javascript复制<build>
<plugins>
<plugin>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<configuration>...</configuration>
</plugin>
</plugins>
</build>
(2)插件的配置
在pom.xml文件中可以为插件提供参数和配置信息,以满足不同的项目要求。
使用元素可以为插件提供配置信息,可以通过以下方式访问插件参数:
代码语言:javascript复制<configuration>
<parameter1>...</parameter1>
<parameter2>...</parameter2>
...
</configuration>
(3) 插件的绑定
使用元素可以将插件绑定到指定的构建阶段。
下面代码将插件maven-compiler-plugin
绑定到执行目标compile中。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<executions>
<execution>
<id>default-compile</id>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
七、Maven的多模块项目
当项目逐渐变得庞大和复杂时,使用Maven单模块项目管理可能会出现可读性下降、命名冲突、编译效率低、拓展性差等问题。
为解决这些问题,Maven提供了多模块项目的方案。
什么是多模块项目
Maven的多模块项目是指由多个独立但相关的子模块组成的项目,它们共同构成了一个项目的整体。多模块项目允许将一个大型项目拆分为多个小型模块进行开发、管理和维护,每个子模块都可以独立编译、打包和测试。
同时,多模块项目也可以通过模块之间的依赖关系,实现子模块之间的通信和协同工作
多模块项目有哪些优势:
- 模块化:将大型项目拆分为多个小模块,每个模块都可以独立编译、测试和打包。
- 依赖管理:简化了模块间依赖问题的复杂性。
- 构建效率:每个模块都可以开始自己的构建流程同时解决各自的编译问题。
- 代码重用:高内聚低耦合,方便代码复用。
- 易于维护:基于单一责任原则,易于维护和迭代。
八、Maven的仓库管理
本地仓库、中央仓库、远程仓库
Maven可以自动下载项目依赖,那么从哪里下载?
Maven以仓库的形式 存储所有Maven构建过程中需要的依赖包和插件包的系统。Maven仓库可以分为以下三类:
- 本地仓库: 本地仓库是Maven构建过程中用于存储依赖包和插件包的本地存储路径,一般位于开发者的用户目录下。
- 中央仓库: 中央仓库(Central Repository)是Maven的默认远程仓库,包含了众多的开源Java库和框架的依赖,Maven会通过访问中央仓库下载项目依赖。
- 远程仓库: 除中央仓库外的非本地仓库。比如团队自建的私有仓库。
如何配置Maven的仓库
配置Maven仓库主要包括两个方面:本地仓库和远程仓库。
(1)配置本地仓库
我们可以在Maven的配置文件settings.xml中配置Maven本地仓库。
代码语言:javascript复制<!-- apache-maven-3.9.2/conf/settings.xml: -->
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>{指定仓库的路径,必须是绝对路径}</localRepository>
从注释中可以看出,Maven的默认本地仓库路径是用户根目录下的.m2/repository
(2)配置远程仓库
远程仓库同样在settings.xml中配置:
代码语言:javascript复制<!-- apache-maven-3.9.2/conf/settings.xml: -->
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
...
</mirrors>