🚀 Maven 全网最细学习手册(上篇)
💡 基础到进阶:掌握Maven核心概念、POM配置、生命周期与插件,为企业级开发打下坚实基础!
📖 学习导航
- 🎯 适合人群:Java开发初学者、想深入学习Maven的开发者
- ⏱️ 学习时长:建议3-4天完成上篇内容
- 🎓 学习目标:掌握Maven核心概念、熟练配置POM文件、理解生命周期和插件机制
- 📚 学习方式:理论+实践,每个知识点都有详细示例
📚 系列文章导航
- 📖 上篇:基础概念 + POM配置 + 生命周期与插件
- 📖 下篇:高级应用 + 多模块项目 + 实战案例 + 最佳实践
📌 第一阶段:Maven 基础概念与环境搭建
🎯 1. Maven 是什么?深度解析
1.1 Maven 的核心作用
Maven(意为"专家"、“内行”)是Apache软件基金会的一个项目管理和构建自动化工具,主要用于Java项目。
🔧 三大核心功能:
- 依赖管理:自动下载和管理项目所需的第三方库
- 项目构建:编译、测试、打包、部署的自动化流程
- 项目标准化:统一的项目结构和构建流程
1.2 Maven vs. 其他构建工具对比
| 特性 | Maven | Ant | Gradle |
|---|---|---|---|
| 配置方式 | XML声明式 | XML过程式 | Groovy/Kotlin DSL |
| 依赖管理 | ✅ 内置强大 | ❌ 需要手动 | ✅ 内置强大 |
| 学习曲线 | 中等 | 简单 | 较陡 |
| 构建速度 | 中等 | 快 | 最快 |
| 生态系统 | 最成熟 | 较少 | 快速发展 |
| 企业采用 | 最广泛 | 逐渐减少 | 快速增长 |
1.3 Maven 的核心思想
🎯 约定优于配置(Convention over Configuration)
- 标准化的目录结构
- 预定义的构建生命周期
- 默认的插件配置
- 统一的依赖管理方式
💡 好处:
- 减少配置工作量
- 提高项目的可维护性
- 团队协作更加高效
- 降低学习成本
🛠️ 2. Maven 安装与配置详解
2.1 下载和安装 Maven
📥 下载步骤:
- 访问官网:https://maven.apache.org/download.cgi
- 选择最新稳定版本(推荐3.8.x或3.9.x)
- 下载二进制包:
apache-maven-3.9.5-bin.zip
💻 Windows 安装:
# 1. 解压到指定目录(建议无中文路径)
C:\Program Files\Apache\maven\apache-maven-3.9.5
# 2. 配置环境变量
MAVEN_HOME = C:\Program Files\Apache\maven\apache-maven-3.9.5
PATH = %PATH%;%MAVEN_HOME%\bin
# 3. 验证安装
mvn -version
🐧 Linux/Mac 安装:
# 1. 解压
tar -xzf apache-maven-3.9.5-bin.tar.gz
sudo mv apache-maven-3.9.5 /opt/maven
# 2. 配置环境变量(~/.bashrc 或 ~/.zshrc)
export MAVEN_HOME=/opt/maven
export PATH=$PATH:$MAVEN_HOME/bin
# 3. 重新加载配置
source ~/.bashrc
# 4. 验证安装
mvn -version
✅ 安装成功标志:
Apache Maven 3.9.5 (57804ffe001d7215b5e7bcb531cf83df38f93546)
Maven home: /opt/maven
Java version: 11.0.16, vendor: Eclipse Adoptium
Java home: /usr/lib/jvm/temurin-11-jdk-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-74-generic", arch: "amd64", family: "unix"
2.2 配置 Maven 本地仓库
📁 默认仓库位置:
- Windows:
C:\Users\{用户名}\.m2\repository - Linux/Mac:
~/.m2/repository
🔧 自定义仓库位置(settings.xml):
步骤1:找到settings.xml文件
# Maven安装目录下的全局配置
{MAVEN_HOME}/conf/settings.xml
# 用户目录下的个人配置(优先级更高)
~/.m2/settings.xml
步骤2:配置本地仓库
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- 本地仓库路径 -->
<localRepository>D:\maven\repository</localRepository>
<!-- 离线模式 -->
<offline>false</offline>
<!-- 插件组 -->
<pluginGroups>
<pluginGroup>org.apache.maven.plugins</pluginGroup>
<pluginGroup>org.codehaus.mojo</pluginGroup>
</pluginGroups>
<!-- 镜像配置(加速下载) -->
<mirrors>
<!-- 阿里云镜像 -->
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
<!-- 配置文件 -->
<profiles>
<profile>
<id>jdk-11</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>11</jdk>
</activation>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.compilerVersion>11</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
</settings>
🚀 常用镜像配置:
<!-- 华为云镜像 -->
<mirror>
<id>huaweicloud</id>
<mirrorOf>*</mirrorOf>
<url>https://repo.huaweicloud.com/repository/maven/</url>
</mirror>
<!-- 腾讯云镜像 -->
<mirror>
<id>nexus-tencentyun</id>
<mirrorOf>*</mirrorOf>
<url>http://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url>
</mirror>
📁 3. Maven 项目结构深度解析
3.1 标准目录布局详解
my-project/ # 项目根目录
├── src/ # 源代码目录
│ ├── main/ # 主要源代码
│ │ ├── java/ # Java源代码
│ │ │ └── com/example/ # 包结构
│ │ │ └── App.java # 主类
│ │ ├── resources/ # 资源文件
│ │ │ ├── application.properties # 配置文件
│ │ │ ├── logback.xml # 日志配置
│ │ │ └── static/ # 静态资源
│ │ └── webapp/ # Web应用资源(仅Web项目)
│ │ ├── WEB-INF/ # Web配置
│ │ │ └── web.xml # Web部署描述符
│ │ ├── css/ # 样式文件
│ │ ├── js/ # JavaScript文件
│ │ └── index.html # 首页
│ └── test/ # 测试代码
│ ├── java/ # 测试Java代码
│ │ └── com/example/ # 测试包结构
│ │ └── AppTest.java # 测试类
│ └── resources/ # 测试资源文件
│ └── test.properties # 测试配置
├── target/ # 编译输出目录(自动生成)
│ ├── classes/ # 编译后的class文件
│ ├── test-classes/ # 测试class文件
│ ├── surefire-reports/ # 测试报告
│ └── my-project-1.0.jar # 打包后的jar文件
├── pom.xml # Maven项目对象模型文件
└── README.md # 项目说明文档
3.2 为什么采用这种目录结构?
🎯 设计原则:
- 关注点分离:源码、测试、资源分别存放
- 约定优于配置:标准化减少配置工作
- 构建工具友好:IDE和构建工具都能识别
- 团队协作:统一结构便于团队开发
💡 各目录作用详解:
| 目录 | 作用 | 说明 |
|---|---|---|
src/main/java | 主要Java源代码 | 业务逻辑代码 |
src/main/resources | 主要资源文件 | 配置文件、静态资源等 |
src/main/webapp | Web应用资源 | 仅Web项目需要 |
src/test/java | 测试Java代码 | 单元测试、集成测试 |
src/test/resources | 测试资源文件 | 测试配置文件 |
target | 构建输出目录 | 编译、打包结果 |
3.3 手动创建 Maven 项目
方法1:使用Maven原型(推荐)
# 创建简单Java项目
mvn archetype:generate \
-DgroupId=com.example \
-DartifactId=my-app \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
# 创建Web项目
mvn archetype:generate \
-DgroupId=com.example \
-DartifactId=my-web-app \
-DarchetypeArtifactId=maven-archetype-webapp \
-DinteractiveMode=false
方法2:手动创建目录结构
# 创建项目根目录
mkdir my-project && cd my-project
# 创建标准目录结构
mkdir -p src/main/java/com/example
mkdir -p src/main/resources
mkdir -p src/test/java/com/example
mkdir -p src/test/resources
# 创建基本的pom.xml文件
touch pom.xml
📝 基础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-project</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>My Project</name>
<description>A sample Maven project</description>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- JUnit 5 测试框架 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
📌 第二阶段:POM 文件深度解析
📋 4. pom.xml 完全详解
POM(Project Object Model)是Maven的核心,包含了项目的所有信息和配置。
4.1 GAV 坐标详解
🎯 GAV坐标是Maven项目的唯一标识符:
<!-- G: Group ID - 组织或公司的标识 -->
<groupId>com.example</groupId>
<!-- A: Artifact ID - 项目的标识 -->
<artifactId>my-project</artifactId>
<!-- V: Version - 版本号 -->
<version>1.0.0-SNAPSHOT</version>
📝 命名规范:
| 元素 | 命名规范 | 示例 |
|---|---|---|
groupId | 反向域名 | com.alibaba, org.apache.commons |
artifactId | 项目名称(小写,用连字符分隔) | spring-boot, mysql-connector-java |
version | 语义化版本 | 1.0.0, 2.1.3-SNAPSHOT |
🔢 版本号规范:
- SNAPSHOT:开发版本,会自动更新
- RELEASE:正式发布版本
- 语义化版本:
主版本.次版本.修订版本- 主版本:不兼容的API修改
- 次版本:向下兼容的功能性新增
- 修订版本:向下兼容的问题修正
4.2 packaging 打包类型
<!-- 打包类型决定了项目的构建方式和输出格式 -->
<packaging>jar</packaging>
📦 常用打包类型:
| 类型 | 说明 | 输出文件 | 适用场景 |
|---|---|---|---|
jar | Java归档文件(默认) | .jar | 普通Java项目、库项目 |
war | Web应用归档文件 | .war | Web应用项目 |
pom | 仅包含POM文件 | 无 | 父项目、聚合项目 |
ear | 企业应用归档文件 | .ear | Java EE应用 |
maven-plugin | Maven插件 | .jar | Maven插件开发 |
4.3 properties 属性配置
<properties>
<!-- 编译器版本 -->
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<!-- 编码设置 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 依赖版本管理 -->
<spring.version>5.3.21</spring.version>
<junit.version>5.9.2</junit.version>
<mysql.version>8.0.33</mysql.version>
<!-- 插件版本 -->
<maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
<maven-surefire-plugin.version>3.0.0</maven-surefire-plugin.version>
<!-- 自定义属性 -->
<project.mainClass>com.example.Application</project.mainClass>
<docker.image.prefix>example</docker.image.prefix>
</properties>
💡 属性使用方式:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
4.4 dependencies 依赖管理详解
<dependencies>
<!-- 基础依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
<!-- 依赖范围 -->
<scope>compile</scope>
<!-- 可选依赖 -->
<optional>false</optional>
<!-- 排除传递依赖 -->
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 测试依赖 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- 运行时依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
<scope>runtime</scope>
</dependency>
<!-- 提供的依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
4.5 scope 依赖范围详解
| 范围 | 编译时 | 测试时 | 运行时 | 传递性 | 说明 |
|---|---|---|---|---|---|
compile | ✅ | ✅ | ✅ | ✅ | 默认范围,所有阶段都需要 |
provided | ✅ | ✅ | ❌ | ❌ | 编译和测试时需要,运行时由容器提供 |
runtime | ❌ | ✅ | ✅ | ✅ | 运行和测试时需要,编译时不需要 |
test | ❌ | ✅ | ❌ | ❌ | 仅测试时需要 |
system | ✅ | ✅ | ❌ | ❌ | 类似provided,但需要显式指定jar路径 |
import | - | - | - | - | 仅用于dependencyManagement中导入BOM |
🔍 实际应用示例:
<!-- compile: 业务逻辑依赖 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
<!-- scope默认为compile,可以省略 -->
</dependency>
<!-- provided: Servlet API(Tomcat提供) -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- runtime: 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
<scope>runtime</scope>
</dependency>
<!-- test: 测试框架 -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.11.0</version>
<scope>test</scope>
</dependency>
4.6 optional 可选依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.21</version>
<optional>true</optional>
</dependency>
💡 可选依赖的作用:
- 当前项目可以使用该依赖
- 但依赖当前项目的其他项目不会自动获得该依赖
- 需要显式声明才能使用
4.7 build 构建配置
<build>
<!-- 最终构建的文件名 -->
<finalName>my-application</finalName>
<!-- 源码目录(默认src/main/java) -->
<sourceDirectory>src/main/java</sourceDirectory>
<!-- 测试源码目录(默认src/test/java) -->
<testSourceDirectory>src/test/java</testSourceDirectory>
<!-- 资源文件配置 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<!-- 插件配置 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
4.8 parent 父POM继承
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
<relativePath/>
</parent>
💡 继承的内容:
- 依赖版本管理
- 插件配置
- 属性配置
- 仓库配置
4.9 modules 多模块项目
<modules>
<module>my-project-core</module>
<module>my-project-web</module>
<module>my-project-service</module>
</modules>
🔍 5. 依赖管理深度实践
5.1 如何查找依赖?
🌐 主要依赖搜索网站:
-
Maven Central Repository
- 网址:https://search.maven.org/
- 特点:官方仓库,最权威
- 使用:搜索artifact名称或groupId
-
MVN Repository
- 网址:https://mvnrepository.com/
- 特点:界面友好,信息详细
- 优势:显示依赖统计、版本历史
-
Spring Initializr
- 网址:https://start.spring.io/
- 特点:Spring生态专用
- 优势:自动生成项目结构
🔍 搜索技巧:
# 1. 按类名搜索
搜索关键词:StringUtils
结果:org.apache.commons:commons-lang3
# 2. 按功能搜索
搜索关键词:JSON parser
结果:com.fasterxml.jackson.core:jackson-core
# 3. 按厂商搜索
搜索关键词:alibaba fastjson
结果:com.alibaba:fastjson
5.2 依赖传递性机制
🔗 传递性依赖示例:
项目A 依赖 项目B (1.0)
项目B 依赖 项目C (2.0)
项目B 依赖 项目D (1.5)
结果:项目A 自动获得 项目C (2.0) 和 项目D (1.5)
📊 依赖传递规则:
-
最短路径优先
A → B → C → X (2.0) A → D → X (1.0) 结果:选择 X (1.0) - 路径更短 -
第一声明优先
<!-- 在pom.xml中的声明顺序 --> <dependency> <groupId>org.example</groupId> <artifactId>lib-a</artifactId> <!-- 依赖 X (1.0) --> </dependency> <dependency> <groupId>org.example</groupId> <artifactId>lib-b</artifactId> <!-- 依赖 X (2.0) --> </dependency> 结果:选择 X (1.0) - 先声明 -
覆盖传递依赖
<!-- 显式声明覆盖传递依赖 --> <dependency> <groupId>org.example</groupId> <artifactId>X</artifactId> <version>3.0</version> <!-- 覆盖传递的1.0或2.0版本 --> </dependency>
5.3 依赖冲突解决策略
🔧 查看依赖树:
# 查看完整依赖树
mvn dependency:tree
# 查看特定依赖的冲突
mvn dependency:tree -Dverbose -Dincludes=org.springframework:spring-core
# 分析依赖冲突
mvn dependency:analyze
📋 依赖树输出示例:
[INFO] com.example:my-project:jar:1.0.0
[INFO] +- org.springframework:spring-core:jar:5.3.21:compile
[INFO] | +- org.springframework:spring-jcl:jar:5.3.21:compile
[INFO] | \- (commons-logging:commons-logging:jar:1.2:compile - omitted for conflict with 1.1.3)
[INFO] +- commons-logging:commons-logging:jar:1.1.3:compile
[INFO] \- junit:junit:jar:4.13.2:test
[INFO] \- org.hamcrest:hamcrest-core:jar:1.3:test
🛠️ 解决冲突的方法:
方法1:使用exclusions排除冲突依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.21</version>
<exclusions>
<!-- 排除冲突的commons-logging -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
方法2:显式声明依赖版本
<!-- 显式声明要使用的版本 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
方法3:使用dependencyManagement统一管理
<dependencyManagement>
<dependencies>
<!-- 统一版本管理 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</dependencyManagement>
📌 第三阶段:Maven 生命周期与插件
🔄 6. Maven 生命周期详解
Maven有三个内置的构建生命周期:Clean、Default和Site。
6.1 Clean 生命周期
🧹 清理项目构建产生的文件
| 阶段 | 说明 |
|---|---|
pre-clean | 执行清理前需要完成的工作 |
clean | 清理上一次构建生成的文件 |
post-clean | 执行清理后需要完成的工作 |
# 清理项目
mvn clean
# 清理并编译
mvn clean compile
6.2 Default 生命周期(核心)
🏗️ 项目部署的处理
| 阶段 | 说明 | 常用命令 |
|---|---|---|
validate | 验证项目是否正确且所有必须信息是可用的 | - |
compile | 编译项目的源代码 | mvn compile |
test | 使用合适的单元测试框架测试已编译的源代码 | mvn test |
package | 接受已编译的代码并打包成可发布的格式 | mvn package |
verify | 运行任何检查以验证包是否有效且达到质量标准 | mvn verify |
install | 安装包到本地仓库,以让其它项目依赖 | mvn install |
deploy | 将最终的包复制到远程仓库 | mvn deploy |
🔍 详细阶段说明:
# 1. 编译主代码
mvn compile
# 编译 src/main/java 下的Java文件到 target/classes
# 2. 编译测试代码
mvn test-compile
# 编译 src/test/java 下的测试文件到 target/test-classes
# 3. 运行测试
mvn test
# 运行单元测试,生成测试报告
# 4. 打包项目
mvn package
# 根据packaging类型打包(jar/war/ear等)
# 5. 安装到本地仓库
mvn install
# 将项目安装到本地Maven仓库
# 6. 部署到远程仓库
mvn deploy
# 将项目部署到远程Maven仓库
6.3 Site 生命周期
📄 创建项目站点文档
| 阶段 | 说明 |
|---|---|
pre-site | 执行生成站点前需要完成的工作 |
site | 生成项目的站点文档 |
post-site | 执行生成站点后需要完成的工作 |
site-deploy | 将生成的站点文档部署到特定的服务器 |
# 生成项目站点
mvn site
# 生成并部署站点
mvn site-deploy
6.4 生命周期阶段的执行顺序
⚡ 重要特性:
- 执行某个阶段时,会自动执行该阶段之前的所有阶段
- 不同生命周期之间相互独立
# 执行package时的完整流程
mvn package
# 实际执行顺序:
# 1. validate
# 2. initialize
# 3. generate-sources
# 4. process-sources
# 5. generate-resources
# 6. process-resources
# 7. compile
# 8. process-classes
# 9. generate-test-sources
# 10. process-test-sources
# 11. generate-test-resources
# 12. process-test-resources
# 13. test-compile
# 14. process-test-classes
# 15. test
# 16. prepare-package
# 17. package
🔌 7. Maven 插件详解
Maven的核心功能都是通过插件实现的。每个生命周期阶段都绑定了特定的插件目标。
7.1 插件的基本概念
🎯 插件目标(Plugin Goal)
- 插件是由一个或多个目标组成的
- 目标是插件中的一个功能单元
- 格式:
插件前缀:目标或groupId:artifactId:version:goal
# 执行编译插件的compile目标
mvn compiler:compile
# 执行依赖插件的tree目标
mvn dependency:tree
7.2 常用插件详解
🔧 maven-compiler-plugin(编译插件)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<!-- Java版本 -->
<source>11</source>
<target>11</target>
<!-- 编码格式 -->
<encoding>UTF-8</encoding>
<!-- 编译参数 -->
<compilerArgs>
<arg>-parameters</arg>
<arg>-Xlint:unchecked</arg>
</compilerArgs>
<!-- 是否显示详细信息 -->
<verbose>true</verbose>
<!-- 是否显示弃用警告 -->
<showDeprecation>true</showDeprecation>
<!-- 是否显示警告 -->
<showWarnings>true</showWarnings>
</configuration>
</plugin>
🧪 maven-surefire-plugin(测试插件)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<!-- 跳过测试 -->
<skipTests>false</skipTests>
<!-- 测试失败时是否忽略 -->
<testFailureIgnore>false</testFailureIgnore>
<!-- 包含的测试文件 -->
<includes>
<include>**/*Test.java</include>
<include>**/*Tests.java</include>
</includes>
<!-- 排除的测试文件 -->
<excludes>
<exclude>**/*IntegrationTest.java</exclude>
</excludes>
<!-- 并行执行 -->
<parallel>methods</parallel>
<threadCount>4</threadCount>
<!-- 系统属性 -->
<systemPropertyVariables>
<spring.profiles.active>test</spring.profiles.active>
</systemPropertyVariables>
</configuration>
</plugin>
📦 maven-jar-plugin(JAR打包插件)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<!-- 归档配置 -->
<archive>
<!-- 清单文件配置 -->
<manifest>
<!-- 添加classpath -->
<addClasspath>true</addClasspath>
<!-- classpath前缀 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- 主类 -->
<mainClass>com.example.Application</mainClass>
</manifest>
<!-- 清单条目 -->
<manifestEntries>
<Built-By>Maven</Built-By>
<Build-Jdk>${java.version}</Build-Jdk>
<Implementation-Version>${project.version}</Implementation-Version>
</manifestEntries>
</archive>
<!-- 排除文件 -->
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</configuration>
</plugin>
🌐 maven-war-plugin(WAR打包插件)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<!-- WAR文件名 -->
<warName>my-web-app</warName>
<!-- 是否失败在缺少web.xml -->
<failOnMissingWebXml>false</failOnMissingWebXml>
<!-- Web资源目录 -->
<webResources>
<resource>
<directory>src/main/webapp</directory>
<filtering>true</filtering>
<includes>
<include>**/*.html</include>
<include>**/*.jsp</include>
</includes>
</resource>
</webResources>
<!-- 归档配置 -->
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
🎁 maven-assembly-plugin(自定义打包插件)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.4.2</version>
<configuration>
<!-- 描述符 -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<!-- 主类 -->
<archive>
<manifest>
<mainClass>com.example.Application</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
7.3 插件执行配置
⚙️ executions 执行配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.1.0</version>
<executions>
<!-- 在compile阶段执行 -->
<execution>
<id>compile-phase-execution</id>
<phase>compile</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<echo message="编译阶段执行自定义任务"/>
<mkdir dir="${project.build.directory}/custom"/>
</target>
</configuration>
</execution>
<!-- 在package阶段执行 -->
<execution>
<id>package-phase-execution</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<echo message="打包阶段执行自定义任务"/>
<copy todir="${project.build.directory}/custom">
<fileset dir="${project.build.directory}/classes"/>
</copy>
</target>
</configuration>
</execution>
</executions>
</plugin>
📚 上篇总结与下篇预告
🎯 上篇学习成果检验
通过上篇的学习,您应该掌握:
✅ 基础概念
- Maven的核心作用和设计思想
- 标准项目结构和目录布局
- 环境安装和配置优化
✅ POM文件配置
- GAV坐标系统和命名规范
- 依赖管理和scope范围
- 属性配置和构建设置
- 依赖冲突的识别和解决
✅ 生命周期与插件
- 三大生命周期的阶段和作用
- 常用插件的配置和使用
- 插件执行的绑定和配置
🚀 下篇内容预告
在下篇中,我们将深入探讨:
📌 第四阶段:高级应用
- 🏗️ 多模块项目管理:父子POM配置、模块依赖、构建策略
- 🎛️ Profile配置管理:多环境配置、条件激活、属性覆盖
- 📦 仓库管理:本地/远程仓库、镜像配置、部署策略
📌 第五阶段:实战案例与最佳实践
- 🎯 Spring Boot项目实战:完整项目配置、Docker集成
- ⚡ 常用命令大全:依赖管理、插件操作、高级选项
- 🔧 故障排除指南:常见问题诊断、调试技巧、性能优化
- 🏆 最佳实践:项目结构规范、版本管理、构建优化
📚 继续学习:建议先通过实际项目练习上篇内容,熟悉Maven的基础操作后,再继续学习下篇的高级应用和实战案例。
💡 学习建议:上篇内容是Maven学习的基础,建议通过创建实际项目来练习POM配置、依赖管理和插件使用,为学习下篇的高级内容做好准备。
10万+

被折叠的 条评论
为什么被折叠?



