文章目录
1. Maven核心概念
1.1 什么是Maven
Maven是一个基于项目对象模型(POM)的项目管理工具,主要用于:
- 项目构建
- 依赖管理
- 项目报告
- 项目文档
- 项目分发
- 项目发布
1.2 Maven的核心思想
约定优于配置(Convention Over Configuration)
src/main/java - Java源代码
src/main/resources - 资源文件
src/main/webapp - Web资源
src/test/java - 测试代码
src/test/resources - 测试资源
target - 编译输出
依赖管理
- 自动下载依赖
- 传递依赖管理
- 版本冲突解决
- 依赖范围控制
2. Maven项目结构
2.1 标准目录结构
project-root/
├── src/
│ ├── main/
│ │ ├── java/ # Java源代码
│ │ ├── resources/ # 配置文件
│ │ └── webapp/ # Web应用资源
│ └── test/
│ ├── java/ # 测试代码
│ └── resources/ # 测试资源
├── target/ # 编译输出
├── pom.xml # 项目配置文件
└── README.md
2.2 POM文件结构
<?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>Project description</description>
<url>http://example.com</url>
<!-- 属性定义 -->
<properties>
<java.version>17</java.version>
<spring.version>3.2.0</spring.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 依赖管理 -->
<dependencies>
<!-- 依赖项 -->
</dependencies>
<!-- 构建配置 -->
<build>
<plugins>
<!-- 插件配置 -->
</plugins>
</build>
<!-- 依赖管理 -->
<dependencyManagement>
<!-- 依赖版本管理 -->
</dependencyManagement>
<!-- 仓库配置 -->
<repositories>
<!-- 远程仓库 -->
</repositories>
<!-- 插件仓库 -->
<pluginRepositories>
<!-- 插件仓库 -->
</pluginRepositories>
</project>
3. Maven生命周期
3.1 三大生命周期
1. Clean生命周期
pre-clean → clean → post-clean
2. Default生命周期
validate → compile → test → package → verify → install → deploy
3. Site生命周期
pre-site → site → post-site → site-deploy
3.2 生命周期详解
Default生命周期主要阶段:
阶段 | 描述 | 主要任务 |
---|---|---|
validate | 验证 | 验证项目配置是否正确 |
compile | 编译 | 编译源代码 |
test | 测试 | 运行单元测试 |
package | 打包 | 将编译后的代码打包 |
verify | 验证 | 检查包是否有效 |
install | 安装 | 安装到本地仓库 |
deploy | 部署 | 部署到远程仓库 |
3.3 生命周期绑定
<build>
<plugins>
<!-- 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
<!-- 测试插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.1.2</version>
</plugin>
<!-- 打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
</plugin>
</plugins>
</build>
4. 依赖管理
4.1 依赖坐标
<dependency>
<groupId>org.springframework.boot</groupId> <!-- 组织ID -->
<artifactId>spring-boot-starter-web</artifactId> <!-- 项目ID -->
<version>3.2.0</version> <!-- 版本号 -->
<scope>compile</scope> <!-- 依赖范围 -->
<optional>false</optional> <!-- 是否可选 -->
<exclusions> <!-- 排除传递依赖 -->
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
4.2 依赖范围(Scope)
Scope | 编译时 | 测试时 | 运行时 | 说明 |
---|---|---|---|---|
compile | ✓ | ✓ | ✓ | 默认范围,所有阶段都可用 |
provided | ✓ | ✓ | ✗ | 由JDK或容器提供 |
runtime | ✗ | ✓ | ✓ | 运行时需要 |
test | ✗ | ✓ | ✗ | 仅测试时需要 |
system | ✓ | ✓ | ✓ | 系统路径依赖 |
import | - | - | - | 仅用于dependencyManagement |
4.3 依赖传递
传递依赖规则:
直接依赖\传递依赖 | compile | provided | runtime | test |
---|---|---|---|---|
compile | compile | - | runtime | - |
provided | provided | provided | provided | - |
runtime | runtime | - | runtime | - |
test | test | - | test | - |
4.4 依赖冲突解决
1. 最短路径优先
A → B → C(1.0)
A → D → E → C(2.0)
# 选择C(1.0),路径更短
2. 第一声明优先
A → B → C(1.0)
A → D → C(2.0)
# 选择先声明的版本
3. 排除传递依赖
<dependency>
<groupId>com.example</groupId>
<artifactId>library</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
5. Maven仓库
5.1 仓库类型
1. 本地仓库
- 位置:
~/.m2/repository
- 作用:存储本地下载的依赖
2. 中央仓库
- URL:
https://repo1.maven.org/maven2/
- 作用:Maven官方仓库
3. 远程仓库
- 私有仓库:Nexus、Artifactory
- 镜像仓库:阿里云、华为云等
5.2 仓库配置
<!-- 远程仓库配置 -->
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo1.maven.org/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<!-- 私有仓库 -->
<repository>
<id>private-repo</id>
<name>Private Repository</name>
<url>http://nexus.company.com/repository/maven-public/</url>
</repository>
</repositories>
<!-- 插件仓库 -->
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo1.maven.org/maven2</url>
</pluginRepository>
</pluginRepositories>
5.3 镜像配置
<!-- settings.xml -->
<mirrors>
<mirror>
<id>aliyun</id>
<name>Aliyun Maven Repository</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
6. Maven插件
6.1 常用插件
1. 编译插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
2. 资源插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<encoding>UTF-8</encoding>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>pdf</nonFilteredFileExtension>
<nonFilteredFileExtension>swf</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
3. 打包插件
<!-- JAR打包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.MainClass</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
<!-- WAR打包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.4.0</version>
<configuration>
<warSourceDirectory>src/main/webapp</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
4. Spring Boot插件
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<mainClass>com.example.Application</mainClass>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
6.2 自定义插件
@Mojo(name = "hello", defaultPhase = LifecyclePhase.COMPILE)
public class HelloMojo extends AbstractMojo {
@Parameter(property = "hello.greeting", defaultValue = "Hello World!")
private String greeting;
@Parameter(property = "hello.name", defaultValue = "Maven")
private String name;
public void execute() throws MojoExecutionException {
getLog().info(greeting + " " + name + "!");
}
}
7. 多模块项目
7.1 项目结构
parent-project/
├── pom.xml (父POM)
├── common/
│ ├── pom.xml
│ └── src/
├── service/
│ ├── pom.xml
│ └── src/
├── web/
│ ├── pom.xml
│ └── src/
└── api/
├── pom.xml
└── src/
7.2 父POM配置
<?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>parent-project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<name>Parent Project</name>
<!-- 子模块 -->
<modules>
<module>common</module>
<module>service</module>
<module>web</module>
<module>api</module>
</modules>
<!-- 统一版本管理 -->
<properties>
<java.version>17</java.version>
<spring.version>3.2.0</spring.version>
<mybatis.version>1.8.0</mybatis.version>
</properties>
<!-- 依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 统一插件管理 -->
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
7.3 子模块POM
<?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>
<!-- 继承父POM -->
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>common</artifactId>
<packaging>jar</packaging>
<name>Common Module</name>
<dependencies>
<!-- 依赖会自动继承版本 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
</dependencies>
</project>
8. Maven高级特性
8.1 Profile配置
<profiles>
<!-- 开发环境 -->
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<spring.profiles.active>dev</spring.profiles.active>
<db.url>jdbc:mysql://localhost:3306/dev_db</db.url>
</properties>
</profile>
<!-- 生产环境 -->
<profile>
<id>prod</id>
<properties>
<spring.profiles.active>prod</spring.profiles.active>
<db.url>jdbc:mysql://prod-server:3306/prod_db</db.url>
</properties>
</profile>
</profiles>
8.2 资源过滤
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
8.3 属性替换
# application.properties
db.url=${db.url}
spring.profiles.active=${spring.profiles.active}
8.4 Maven Wrapper
# 生成Maven Wrapper
mvn wrapper:wrapper
# 使用Wrapper
./mvnw clean install
./mvnw spring-boot:run
9. 最佳实践
9.1 依赖管理最佳实践
- 使用dependencyManagement统一版本
- 避免使用SNAPSHOT版本
- 及时更新依赖版本
- 使用BOM管理依赖
9.2 插件配置最佳实践
- 明确指定插件版本
- 合理配置插件参数
- 避免重复配置
9.3 项目结构最佳实践
- 遵循Maven标准目录结构
- 合理划分模块
- 使用继承和聚合
9.4 性能优化
- 使用本地仓库
- 配置镜像仓库
- 合理使用并行构建
- 避免不必要的依赖
10. 常见问题解决
10.1 依赖冲突
# 查看依赖树
mvn dependency:tree
# 分析依赖冲突
mvn dependency:analyze
# 排除冲突依赖
mvn dependency:resolve
10.2 构建失败
# 清理项目
mvn clean
# 跳过测试
mvn install -DskipTests
# 强制更新依赖
mvn clean install -U
10.3 内存不足
# 增加Maven内存
export MAVEN_OPTS="-Xmx2048m -XX:MaxPermSize=512m"
# 使用并行构建
mvn clean install -T 4
Maven是一个功能强大的项目管理工具,掌握其核心概念和高级特性对于Java开发至关重要。通过合理配置和使用Maven,可以大大提高项目开发效率和质量。