Maven 是 Java 项目的一个强大的项目管理和构建自动化工具。它基于项目对象模型(POM,Project Object Model)的概念,允许开发者通过一个中央配置文件(通常是 pom.xml 文件)来管理项目的构建、报告和文档。以下是 Maven 使用中的一些基本概念:
1、POM (Project Object Model)
1.1简介
- 是 Maven 的核心,是一个 XML 文件(通常是 pom.xml),它包含了项目的基本信息、配置、依赖关系等。
- POM 是 Maven 用来识别和管理项目的关键。
1.2主要元素
- modelVersion:POM文件的版本,通常是4.0.0。
- groupId:项目的组织或组的唯一标识符。
- artifactId:项目的唯一标识符,通常是项目的名称。
- version:项目的版本号。
- packaging:项目的打包方式,如jar、war等。
- name和description:项目的名称和描述(可选)。
- dependencies:项目依赖的列表,每个依赖项都包含groupId、artifactId、version和scope等元素。
- build:构建配置,包括插件列表和插件配置等。
- 其他可选元素,如属性、资源过滤、开发者信息、邮件列表、URL、许可证、组织、SCM等。
1.3代码示例
<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-project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- 项目名称和描述(可选) -->
<name>My Project</name>
<description>A simple Maven project</description>
<!-- 项目依赖 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 其他依赖项... -->
</dependencies>
<!-- 插件配置(可选) -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- 其他插件配置... -->
</plugins>
</build>
<!-- 其他配置,如属性、资源过滤等(可选) -->
<!-- ... -->
<!-- 项目开发者和贡献者(可选) -->
<!-- ... -->
<!-- 邮件列表和URL(可选) -->
<!-- ... -->
<!-- 其他元素,如许可证、组织、SCM等(可选) -->
<!-- ... -->
</project>
2、坐标
2.1简介
- Maven 使用 GAV(GroupId, ArtifactId, Version)坐标来唯一标识一个项目或依赖。
- 由GroupId、ArtifactId、Version三个元素组成
2.2组成元素
groupId:
- 描述了一个项目的组织或组的唯一标识符。这通常是一个反向的域名,如com.example。
- 它有助于区分具有相同artifactId但来自不同组织的项目。
artifactId:
- 是项目的唯一标识符,通常是项目的名称或模块的名称。
- 在groupId的上下文中,artifactId必须是唯一的。
- 例如,一个名为“spring-core”的artifact,表示Spring框架的核心模块。
version:
- 定义了artifact的版本号。
- 对于一个给定的groupId和artifactId,可能存在多个版本。
- Maven在解析依赖时会根据指定的version来查找具体的artifact。
2.3代码示例
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>my-library</artifactId>
<version>1.0.0</version>
<!-- Optional classifier element
<classifier>sources</classifier>
-->
</dependency>
<!-- Other dependencies... -->
</dependencies>
3、依赖管理
3.1简介
- Maven 可以自动处理项目的依赖关系,只需在 POM 文件中声明所需的依赖项和它们的版本。
- Maven 会从中央仓库(或其他配置的仓库)下载这些依赖项,并将其添加到项目的构建路径中。
3.2依赖范围
Maven支持不同的依赖范围,这些范围决定了依赖在项目的哪些阶段(如编译、测试、运行)可用。常用的依赖范围包括:
- compile:默认的依赖范围,依赖在编译、测试和运行时均可用。
- test:仅在测试阶段可用,不会包含在最终的构建产物中。
- runtime:在编译时不需要,但在运行时需要的依赖。
- provided:预期JDK、容器或使用者会提供的依赖,在编译和测试时需要,但在运行时不需要。
- system:与provided类似,但是系统范围依赖项必须显式地提供包含它的JAR。
3.3本地依赖和远程依赖
- 本地依赖:项目所依赖的资源存储在本地开发环境中,通常是通过将JAR文件手动放置在项目的lib目录或Maven的本地仓库中来实现的。
- 远程依赖:项目依赖的资源需要从中央仓库或自定义仓库中下载,并缓存在本地仓库中供项目使用。Maven会首先在中央仓库中查找对应的依赖,并下载到本地仓库中。
4、生命周期
4.1简介
Maven 有一个定义好的项目构建生命周期,包括验证、编译、测试、打包、安装、部署等阶段。
每个阶段都有一组预定义的插件目标(goal)与之关联,这些目标可以执行特定的任务。这些步骤被组织成三套相互独立的生命周期:clean、default和site。
4.1clean生命周期:
- 主要目的是清理项目。
- 包含三个阶段:
- pre-clean:执行清理前需要完成的工作。
- clean:清理上一次构建生成的文件。
- post-clean:执行清理后需要完成的工作。
4.2default生命周期:
- 这是Maven的主要构建生命周期,用于构建项目。
- 包含多个阶段,如validate、compile、test、package、install、deploy等,每个阶段都有特定的目的和任务。
- 这些阶段是有顺序的,后面的阶段依赖于前面的阶段。
4.3site生命周期:
- 主要用于生成项目的站点文档。
- 包含的阶段如site、site-deploy等,用于生成和发布项目文档。
5、插件
5.1简介
- Maven 插件用于扩展 Maven 的核心功能。
- 插件可以执行各种任务,如编译 Java 代码、运行测试、打包项目等。
- 插件目标(goal)是插件提供的具体任务。
5.2常用插件
- maven-compiler-plugin:用于编译Java代码。可以配置源代码和目标字节码的版本。
- maven-jar-plugin:用于将编译后的Java代码打包成JAR文件。可以配置JAR文件的名称、目录等选项。
- maven-dependency-plugin:用于管理项目的依赖项。可以执行复制、分析和解决依赖冲突等任务。
- maven-resources-plugin:用于处理项目的资源文件,如配置文件、图片等。可以配置资源文件的目录和过滤规则等选项。
- spring-boot-maven-plugin:Spring Boot项目的默认打包工具。可以打包项目并生成可执行的JAR或WAR文件。
6、仓库
6.1简介
- Maven 使用仓库来存储项目的依赖和其他构建工件。
- 中央仓库(Central Repository)是 Maven 的默认仓库,包含了大量常用的 Java 库。
- 开发者还可以配置其他仓库,如私有仓库、企业仓库等。
6.2仓库类型
6.2.1本地仓库
- 本地仓库是存储在本地磁盘上的仓库,它是默认的仓库类型。当Maven在执行构建时,会首先在本地仓库中查找所需的依赖项和插件。如果本地仓库中没有所需的依赖项,Maven会从远程仓库中下载。
6.2.2远程仓库
- 中央仓库:中央仓库是由Maven团队维护的远程仓库,它包含了世界上大部分流行的开源项目的构件。中央仓库包含了大量的常用依赖项和插件,因此它是最常用的远程仓库之一。
- 私服仓库:私服仓库是一种特殊的远程仓库,通常由公司内部维护。它可以用于存储公司内部开发或使用的库,或者代理外部的公共仓库。
- 其他公共远程仓库:除了中央仓库和私服仓库之外,还有一些其他的公共远程仓库,例如JFrog Artifactory、Nexus等。
6.3仓库作用
- 依赖管理:通过仓库,Maven可以方便地获取项目所需的依赖项和插件,避免了手动下载和管理的繁琐过程。
- 版本控制:Maven仓库可以存储不同版本的依赖项和插件,通过指定版本号,Maven可以获取特定版本的依赖项和插件,从而确保项目的稳定性和可维护性。
- 团队协作:在团队开发中,多个开发者可以共享同一个仓库,从而方便地共享代码、依赖项和插件。
7、构建配置
- 除了 POM 文件外,Maven 还允许开发者通过其他文件(如 settings.xml)来配置构建环境。
- 这些配置可以包括仓库位置、代理设置、认证信息等。
8、多模块项目
- Maven 支持多模块项目,即一个项目可以包含多个子模块。
- 每个子模块都有自己的 POM 文件,但它们共享一些共同的配置和依赖关系。
9、继承与聚合
- Maven 的 POM 继承允许子模块继承父模块的 POM 配置。
- 聚合则允许一个父 POM 聚合多个子模块的构建,从而可以一次性构建整个项目。
10、属性与资源过滤
- Maven 支持在 POM 文件中定义属性,并在项目的其他部分(如构建脚本、配置文件等)中使用这些属性。
- 资源过滤允许 Maven 在复制资源文件到输出目录之前,对文件中的占位符进行替换。