Maven 构建项目
Maven 是一个项目管理和构建工具,主要用于 Java 项目。它简化了项目的构建、依赖管理、报告生成、发布等一系列工作。
-
构建自动化:Maven 提供了一套标准化的构建生命周期,包括编译、测试、打包、部署等步骤,通过简单的命令就可以执行。
-
依赖管理:Maven 支持自动下载和管理第三方库的依赖,只需在 POM 文件中声明依赖,Maven 就会自动从中央仓库或自定义仓库下载所需的库。
-
插件系统:Maven 可以通过插件扩展功能,比如编译插件、测试插件、打包插件等。
-
项目结构和标准化:Maven 提供了标准的目录结构和约定,使项目更具可读性和易维护性。
-
多模块项目支持:Maven 能够处理包含多个模块的大型项目,每个模块可以单独构建、测试和部署。
Maven 的常用命令:
mvn clean
:清理项目,删除生成的文件。mvn compile
:编译项目。mvn test
:运行测试。mvn package
:将项目打包成 jar 或 war 文件。mvn install
:将生成的文件安装到本地仓库,以供其他项目引用。
文章目录
- 一、Maven 仓库
- 仓库的工作流程:
- 配置仓库:
- 二、Maven 安装并配置
- 1. 下载 Maven
- 2. 配置环境变量
- Windows 系统:
- 3. 验证 Maven 安装
- 4. 配置 Maven (可选)
- 三、构建Maven项目
- 3.1 依赖配置
- 1. 基本的依赖配置格式
- 2. 范围(Scope)
- 3. 依赖的排除(Exclusions)
- 4. 管理依赖版本(Dependency Management)
- 5. 使用依赖的范围和版本管理的最佳实践
- 6. 示例完整的 `pom.xml` 文件:
- 7. 通过 Maven 仓库查找依赖
- 3.2 生命周期
- Maven 的生命周期分为三种主要类型:
- 1. 默认生命周期(Default Lifecycle)
- 2. 清理生命周期(Clean Lifecycle)
- 3. 验证生命周期(Site Lifecycle)
- 4. 生命周期执行顺序
- 5. 绑定生命周期与插件
- 6. 自定义生命周期(自定义目标)
- 总结
- 3.3 Maven 生命周期中的各个阶段
- 1. **clean:清理**
- 2. **compile:编译**
- 3. **test:测试**
- 4. **package:打包**
- 5. **install:安装**
- 这些阶段的顺序
- 总结
一、Maven 仓库
在 Maven 中,仓库(Repository)是一个存储和管理项目依赖、插件和构建产物的地方。Maven 支持三个类型的仓库:
-
本地仓库(Local Repository):
本地仓库是指存储在开发者本机上的 Maven 仓库。当 Maven 构建一个项目时,所有的依赖库(JAR 文件、插件等)会被下载到本地仓库,以便在后续的构建过程中复用,避免每次构建时都从远程仓库下载依赖。默认情况下,本地仓库位于用户的主目录下(例如:~/.m2/repository
)。本地仓库的作用是:
- 存储已经下载的依赖,避免重复下载。
- 存储构建产生的产物,如 JAR 包。
你可以在
settings.xml
文件中修改本地仓库的位置。 -
中央仓库(Central Repository):
Maven 中央仓库是一个公共的、托管的远程仓库,存储了成千上万的开源依赖包和插件。Maven 默认会从中央仓库下载依赖和插件。中央仓库地址通常是:https://repo.maven.apache.org/maven2/
Maven 在构建项目时,如果在本地仓库中找不到所需的依赖,就会去中央仓库查找并下载。
-
远程仓库(Remote Repository):
远程仓库是指不在本地的仓库,通常由企业或团队自行托管,用于存储私有依赖或者某些特殊的依赖。Maven 可以配置多个远程仓库,特别是在项目使用了私有依赖时。例如,一些公司会设置自己的 Maven 仓库来存储私有的 JAR 包、插件等。配置远程仓库通常是在
pom.xml
或settings.xml
文件中进行。例如:<repositories> <repository> <id>example-repository</id> <url>https://example.com/repository</url> </repository> </repositories>
仓库的工作流程:
- 当你构建一个 Maven 项目时,Maven 会先检查本地仓库中是否已经存在所需的依赖。
- 如果不存在,Maven 会访问配置的远程仓库(例如中央仓库或其他自定义仓库)来查找并下载依赖。
- 下载的依赖会被缓存到本地仓库,以便以后使用。
配置仓库:
-
在
pom.xml
中:你可以配置依赖和远程仓库。<dependencies> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency> </dependencies>
-
在
settings.xml
中:你可以配置全局的本地仓库路径、远程仓库、代理等。<localRepository>/path/to/local/repo</localRepository>
二、Maven 安装并配置
1. 下载 Maven
从 Maven 官方网站下载最新版本的 Maven:
- 网站地址:https://maven.apache.org/download.cgi
- 下载二进制文件(Binary zip 或 tar.gz 文件)并解压。
2. 配置环境变量
在安装 Maven 后,需要将它的 bin
目录添加到系统的环境变量中,以便在命令行中全局使用 mvn
命令。
Windows 系统:
- 右键点击“此电脑”或“我的电脑”,选择“属性”。
- 点击“高级系统设置”。
- 在“系统属性”窗口中,点击“环境变量”。
- 在“系统变量”部分,找到
Path
变量,双击它。 - 点击“新建”,将 Maven 的
bin
目录路径添加进去(例如:D:\develop\apache-maven-3.x.x\bin
)。 - 点击“确定”保存。
MAVEN_HOME 为maven的解压目录,并将其bin目录加入PATH环境变量。
path中
3. 验证 Maven 安装
打开命令行(Windows 中使用 cmd
或 PowerShell,macOS/Linux 使用终端),输入以下命令以确认 Maven 是否已正确安装:
mvn -v
正确安装后,你应该看到 Maven 的版本信息,类似于:
Apache Maven 3.x.x (e.g., 3.8.5)
Maven home: /path/to/your/maven
Java version: 1.8.0_231, vendor: Oracle Corporation
4. 配置 Maven (可选)
Maven 提供一个全局配置文件 settings.xml
,位于 Maven 的安装目录的 conf/
文件夹中。你也可以在用户目录下创建一个 ~/.m2/settings.xml
文件来配置用户级别的设置。
常见配置:
-
本地仓库:默认本地仓库是
~/.m2/repository
,可以在settings.xml
中更改本地仓库的路径。<localRepository>/path/to/local/repository</localRepository>
<localRepository>D:\develop\apache-maven-3.x.x\mvn_repo</localRepository>
- 配置阿里云私服::修改 conf/settings.xml 中的 标签,为其添加如下子标签
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
三、构建Maven项目
需要配置
3.1 依赖配置
在 Maven 中,依赖配置是通过 pom.xml
文件来实现的。通过在 pom.xml
中配置依赖项,Maven 会自动下载所需的库,并将它们添加到项目中。
1. 基本的依赖配置格式
Maven 依赖项的基本配置格式如下:
<dependencies>
<dependency>
<groupId>group-id</groupId>
<artifactId>artifact-id</artifactId>
<version>version</version>
</dependency>
</dependencies>
groupId
:指定组织或公司标识,通常是公司域名的反向格式(如com.example
)。artifactId
:指定依赖项的名称。version
:指定依赖项的版本号。
例如,如果你想使用 Apache Commons Lang 库的 3.12.0
版本,可以这样配置:
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
2. 范围(Scope)
Maven 提供了几种依赖范围(scope)来定义依赖的生命周期。常见的依赖范围有:
compile
(默认):在编译、测试、运行时都可用。provided
:编译和测试时可用,但运行时由容器提供(例如 Servlet API)。runtime
:仅在运行时可用,编译时不需要。test
:仅在测试时可用,编译和运行时不需要。system
:在本地文件系统中指定一个 JAR 文件,且需要手动提供路径。import
:用于导入一个 BOM(Bill of Materials)文件,适用于 Maven 版本管理。
示例:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
这个依赖只会在测试阶段使用。
3. 依赖的排除(Exclusions)
有时 Maven 依赖的某些传递性依赖可能会导致冲突,你可以通过排除某些依赖来避免这种情况。
示例:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
上面的配置会排除 jackson-databind
库的 commons-logging
依赖。
4. 管理依赖版本(Dependency Management)
为了集中管理版本信息,Maven 提供了 dependencyManagement
标签。在父 pom.xml
中定义版本信息,子项目可以使用没有版本号的依赖声明,Maven 会自动使用父项目中定义的版本。
示例:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.8</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<!-- No version specified, inherited from dependencyManagement -->
</dependency>
</dependencies>
5. 使用依赖的范围和版本管理的最佳实践
- 使用稳定版本:尽量使用稳定版本的依赖,避免使用 SNAPSHOT(开发版)版本,除非有特定需要。
- 传递性依赖冲突解决:Maven 会自动管理传递性依赖,但如果有版本冲突,可以使用
<exclusion>
标签排除不需要的依赖。 - 使用依赖管理:对于多模块项目,可以在父项目中集中管理依赖版本,以避免子项目中版本不一致的问题。
6. 示例完整的 pom.xml
文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-maven-project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
7. 通过 Maven 仓库查找依赖
你可以通过 Maven 中央仓库(Maven Central Repository)来查找需要的依赖。可以根据 groupId
、artifactId
和 version
搜索并复制依赖配置到你的 pom.xml
文件中。
3.2 生命周期
Maven 的 生命周期(Lifecycle)是指一组由 Maven 按顺序执行的阶段,每个阶段都对应着特定的任务或目标。Maven 生命周期定义了构建过程的顺序和组织方式。
Maven 的生命周期分为三种主要类型:
- 默认生命周期(Default Lifecycle):负责项目的构建、测试、打包等任务。
- 清理生命周期(Clean Lifecycle):负责清理项目生成的文件。
- 验证生命周期(Site Lifecycle):负责生成项目的文档、站点等。
1. 默认生命周期(Default Lifecycle)
默认生命周期是 Maven 中最常用的生命周期,主要涉及构建项目和生成产物。它由若干个阶段(Phase)组成,执行顺序是固定的。常见的阶段有:
阶段 | 说明 |
---|---|
validate | 验证项目的完整性,检查项目配置是否合法。 |
compile | 编译项目的源代码。 |
test | 运行单元测试(编译后的代码)。 |
package | 打包项目(生成 JAR 或 WAR 文件等)。 |
verify | 验证项目是否满足质量标准。 |
install | 将构建产物安装到本地仓库(~/.m2/repository )。 |
deploy | 将构建产物部署到远程仓库,供其他项目使用。 |
这些阶段是按顺序执行的,通常是从 validate
开始,到 deploy
结束。也可以通过 mvn
命令指定执行的阶段,例如:
mvn clean install
此命令会依次执行 clean
和 install
阶段,Maven 会从 clean
阶段开始,先清理生成的文件,然后再进行构建和安装。
2. 清理生命周期(Clean Lifecycle)
清理生命周期用于清理项目,通常用于删除目标文件夹(target/
)中的构建产物。它包含以下主要阶段:
阶段 | 说明 |
---|---|
pre-clean | 在清理之前执行的任务。 |
clean | 删除项目的生成文件,通常是删除 target 目录。 |
post-clean | 清理之后执行的任务。 |
例如,当你运行 mvn clean
时,Maven 会删除 target
目录中所有的构建产物,以确保在重新构建时不会受到旧文件的影响。
3. 验证生命周期(Site Lifecycle)
验证生命周期用于生成项目的站点文档、报告等。它包含以下主要阶段:
阶段 | 说明 |
---|---|
pre-site | 在生成站点之前执行的任务。 |
site | 生成项目的站点(例如:HTML 文档、Javadoc 等)。 |
post-site | 生成站点之后执行的任务。 |
site-deploy | 将生成的站点部署到 Web 服务器或其他目标位置。 |
例如,执行以下命令会生成项目的站点:
mvn site
4. 生命周期执行顺序
Maven 在执行命令时,会根据你指定的阶段和生命周期按顺序执行。如果你执行了一个生命周期中的某个阶段,Maven 会自动执行该阶段之前的所有阶段。例如,执行 mvn package
会依次执行 validate
、compile
、test
、package
阶段。
5. 绑定生命周期与插件
每个阶段都可以绑定到一个或多个 Maven 插件,插件负责在执行阶段时执行特定的任务。例如:
compile
阶段绑定了maven-compiler-plugin
插件,用于编译 Java 源代码。test
阶段绑定了maven-surefire-plugin
插件,用于运行单元测试。
你可以通过 pom.xml
文件来配置插件,并指定插件在某个阶段执行的目标(goal)。
6. 自定义生命周期(自定义目标)
除了 Maven 默认的生命周期外,你还可以在 pom.xml
中定义自定义目标和生命周期。例如,可以为某些自定义任务添加新阶段或目标。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>goal-name</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
总结
Maven 生命周期帮助自动化构建过程,并确保在项目构建过程中按正确的顺序执行各个阶段。通过自定义插件和目标,可以进一步扩展 Maven 的功能,满足项目的特殊需求。你只需要按照生命周期定义的顺序执行任务,Maven 会为你完成其他的依赖和构建任务。
3.3 Maven 生命周期中的各个阶段
1. clean:清理
- 功能:用于清理项目,删除上一次构建生成的文件(通常是删除
target/
目录)。 - 目的:确保没有残留的构建文件,避免影响下一次构建。
- 执行命令:
该命令会删除项目目录中的mvn clean
target
文件夹。
2. compile:编译
- 功能:编译项目的源代码。
- 目的:将项目中的源代码(如 Java 文件)编译成字节码,通常生成
.class
文件。 - 执行命令:
该命令会在mvn compile
target/classes
目录下生成编译后的字节码文件。
3. test:测试
- 功能:运行单元测试。
- 目的:运行项目中的测试代码,确保项目功能正确。测试结果会输出到控制台,并生成测试报告。
- 执行命令:
该命令会使用mvn test
maven-surefire-plugin
插件执行src/test/java
中的测试类,验证项目代码的正确性。
4. package:打包
- 功能:将编译和测试后的代码打包成 JAR、WAR 或其他格式的文件。
- 目的:生成项目的最终产物,以便发布或部署。
- 执行命令:
该命令会根据项目的配置打包文件,通常生成mvn package
target/
目录下的.jar
或.war
文件。
5. install:安装
- 功能:将打包生成的文件安装到本地 Maven 仓库中,以便其他项目依赖。
- 目的:使得其他项目能够使用该项目生成的构建产物作为依赖。
- 执行命令:
该命令会将生成的 JAR 文件安装到本地 Maven 仓库(通常是mvn install
~/.m2/repository
目录)。这样其他 Maven 项目可以通过该依赖来使用该项目。
这些阶段的顺序
通常,执行命令会按顺序执行这些阶段。例如,如果你运行了 mvn clean install
,Maven 会按照以下顺序执行:
- clean:先删除
target
目录。 - compile:编译项目的源代码。
- test:运行单元测试。
- package:将项目打包。
- install:将生成的包安装到本地仓库。
总结
Maven 的这几个阶段通常按顺序执行,clean
阶段清理文件,compile
阶段编译,test
阶段进行单元测试,package
阶段打包,install
阶段将结果安装到本地仓库。这些阶段是 Maven 构建过程中的核心步骤,确保项目能够顺利构建并准备好发布。