什么是Maven?
Maven 是一个强大的 项目管理和构建自动化工具,主要用于 Java 项目。它通过项目对象模型(POM,Project Object Model)来描述项目,管理依赖、构建生命周期、插件等,极大地简化了 Java 项目的构建和管理过程。他极大的简化了java的依赖管理,同时让采用maven架构的项目长得一样整齐,便于维护二开。举几个没有maven的糟糕例子。
如果没有Maven
手动找 jar:打开搜索引擎 → 输入"spring-core-5.3.9.jar 下载" → 点进广告满天飞的论坛 → 下错版本 → 运行时报 NoSuchMethodError → 重下 → 再试。
版本冲突靠眼神:A 框架要 log4j-1.2.17,B 框架要 log4j-1.2.15,你只有把两个 jar 都扔进 lib,classpath 里谁先谁后全凭天命。
目录结构"百家争鸣" : 张三把源码放 src/,李四放 source/,王五把测试代码叫 testSrc/;新人入职第一件事是问"咱们这个项目咋编译?"
构建脚本成"传家宝" :每人私藏一份 2000 行 Ant XML,里面硬编码了 D:\tomcat\webapps 路径;换台电脑就跑不起来。
CI/CD 寸步难行: Jenkins 里要先把 jar 拷到 lib、再改版本号、再手动点按钮;上线一次 30 分钟,喝 3 杯咖啡等结果。
Maven 的核心功能:
| 功能 | 说明 |
|---|---|
| 依赖管理 | 自动下载和管理项目所需的第三方库(如 Spring、MyBatis 等),避免手动导入 jar 包。 |
| 项目构建 | 提供标准化的构建流程:编译、测试、打包、部署等。 |
| 统一结构 | 规定项目目录结构(如 src/main/java、src/test/java),提高项目可读性和可维护性。 |
| 插件机制 | 支持通过插件扩展功能,如打包成 jar、war,生成文档,运行测试等。 |
| 多模块支持 | 支持大型项目的模块化开发,便于管理多个子项目。 |
如何搭建第一个 Maven 工程
1. 环境准备
-
安装 JDK:确保已安装 Java Development Kit
-
安装 Maven:下载并配置 Apache Maven 环境变量
-
验证安装 :在命令行执行以下命令确认安装成功
bashmvn -version
2. 创建 Maven 项目
IDE创建
在Idea等编辑器新建项目时在"构建系统"中选择Maven
使用命令行创建
bash
mvn archetype:generate -DgroupId=com.example -DartifactId=my-first-maven-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
手动创建项目结构
css
my-first-maven-project/
├── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── example/
│ │ └── App.java
│ └── test/
│ └── java/
│ └── com/
│ └── example/
│ └── AppTest.java
└── pom.xml
3. 配置 pom.xml
创建基本的 pom.xml 文件:
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-first-maven-project</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
4. 编写代码
在 src/main/java/com/example/App.java 中创建主类:
java
package com.example;
public class App {
public static void main(String[] args) {
System.out.println("Hello Maven!");
}
public String sayHello(String name) {
return "Hello " + name + "!";
}
}
5. 编译和构建
编译项目
bash
mvn compile
运行测试
bash
mvn test
打包项目
bash
mvn package
清理构建结果
bash
mvn clean
6. Maven 标准目录结构
src/main/java/:Java 源代码src/main/resources/:资源文件src/test/java/:测试代码src/test/resources/:测试资源文件target/:构建输出目录pom.xml:项目对象模型文件
POM 文件全解
1. POM 基本概念
Project Object Model (POM) 是 Maven 项目的核心配置文件,定义了项目的基本信息、依赖关系、构建配置等内容。
2. 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-app</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<!-- 属性配置 -->
<properties>
<java.version>1.8</java.version>
</properties>
<!-- 依赖配置 -->
<dependencies>
<!-- 依赖项 -->
</dependencies>
<!-- 构建配置 -->
<build>
<!-- 构建插件 -->
</build>
</project>
3. 核心元素详解
3.1 基本坐标信息
groupId: 组织标识符,通常使用反向域名artifactId: 项目唯一标识符version: 项目版本号packaging: 打包方式(jar、war、pom等)
3.2 属性配置 (properties)
xml
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
3.3 依赖管理 (dependencies)
xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
依赖范围 (scope)
compile: 编译依赖(默认)provided: 编译和测试时需要,运行时由容器提供runtime: 运行和测试时需要,编译不需要test: 仅测试时需要system: 系统级依赖
3.4 继承与聚合
父项目继承
xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.14</version>
<relativePath/>
</parent>
子模块聚合
xml
<modules>
<module>module1</module>
<module>module2</module>
</modules>
4. 构建配置 (build)
4.1 插件配置
xml
<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>
4.2 资源配置
xml
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
5. 依赖管理进阶
5.1 依赖管理 (dependencyManagement)
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.0</version>
</dependency>
</dependencies>
</dependencyManagement>
5.2 排除依赖
xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.0</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
6. Profiles 配置
xml
<profiles>
<profile>
<id>dev</id>
<properties>
<environment>development</environment>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<environment>production</environment>
</properties>
</profile>
</profiles>
7. 仓库配置
7.1 远程仓库
xml
<repositories>
<repository>
<id>central</id>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
</repositories>
7.2 插件仓库
xml
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>https://repo.maven.apache.org/maven2</url>
</pluginRepository>
</pluginRepositories>
8. 常用 Maven 属性
${project.groupId}: 项目 groupId${project.artifactId}: 项目 artifactId${project.version}: 项目版本${project.build.directory}: 构建目录(target)${project.build.outputDirectory}: 输出目录(target/classes)${project.build.testOutputDirectory}: 测试输出目录(target/test-classes)
POM 文件是 Maven 项目的核心,合理配置 POM 可以有效管理项目依赖、构建过程和发布流程。
Maven 生命周期与插件
1. Maven 生命周期
Maven 生命周期是 Maven 构建过程的抽象表示,定义了构建项目的各个阶段。
1.1 三套生命周期
Clean Lifecycle(清理生命周期)
pre-clean: 执行清理前的工作clean: 清理上一次构建生成的文件(删除target目录)post-clean: 执行清理后的工作
Default Lifecycle(默认生命周期)
validate: 验证项目正确性和必要信息initialize: 初始化构建状态generate-sources: 生成需要编译的源码process-sources: 处理源码generate-resources: 生成需要打包的资源文件process-resources: 处理资源文件并复制到目标目录compile: 编译项目的源码process-classes: 处理编译后的class文件generate-test-sources: 生成测试需要的源码process-test-sources: 处理测试源码generate-test-resources: 生成测试需要的资源文件process-test-resources: 处理测试资源文件test-compile: 编译测试源码process-test-classes: 处理编译后的测试class文件test: 使用单元测试框架运行测试prepare-package: 打包前的准备工作package: 将编译后的代码打包成可分发格式pre-integration-test: 集成测试前的准备工作integration-test: 处理和部署包到集成测试环境post-integration-test: 集成测试后的操作verify: 运行检查验证包是否有效且达到质量标准install: 将包安装到本地仓库deploy: 将最终的包复制到远程仓库
Site Lifecycle(站点生命周期)
pre-site: 生成站点文档前的处理site: 生成项目的站点文档post-site: 生成站点文档后的处理site-deploy: 将生成的站点文档部署到指定服务器
1.2 生命周期特点
- 后面的阶段依赖于前面的阶段
- 跳转到某个阶段会自动执行前面的所有阶段
- 不同生命周期可以同时执行
2. Maven 插件
Maven 插件是实际执行构建任务的组件,每个阶段都由特定插件的目标(goal)来执行。
2.1 插件类型
Build Plugins(构建插件)
在构建生命周期中执行,在 pom.xml 的 <build> 元素中配置:
xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
</plugins>
</build>
Reporting Plugins(报告插件)
在站点生成过程中执行,在 pom.xml 的 <reporting> 元素中配置:
xml
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.2.0</version>
</plugin>
</plugins>
</reporting>
2.2 常用核心插件
| 插件 | 功能 | 默认绑定阶段 |
|---|---|---|
maven-clean-plugin |
清理构建产物 | clean |
maven-compiler-plugin |
编译Java源码 | compile, testCompile |
maven-resources-plugin |
处理资源文件 | process-resources, process-test-resources |
maven-surefire-plugin |
运行单元测试 | test |
maven-jar-plugin |
打包JAR文件 | package |
maven-war-plugin |
打包WAR文件 | package |
maven-install-plugin |
安装到本地仓库 | install |
maven-deploy-plugin |
部署到远程仓库 | deploy |
2.3 插件配置示例
编译插件配置
xml
<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>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
打包插件配置
xml
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.example.Application</mainClass>
</configuration>
</plugin>
3. 命令行执行
3.1 执行特定阶段
bash
mvn clean # 执行 clean 生命周期到 clean 阶段
mvn compile # 执行 default 生命周期到 compile 阶段
mvn test # 执行 default 生命周期到 test 阶段
mvn package # 执行 default 生命周期到 package 阶段
mvn install # 执行 default 生命周期到 install 阶段
mvn site # 执行 site 生命周期到 site 阶段
3.2 执行特定插件目标
bash
mvn plugin:goal
mvn compiler:compile
mvn surefire:test
mvn help:describe -Dplugin=compiler
3.3 组合执行
bash
mvn clean install # 先清理再安装
mvn clean compile test # 清理、编译、测试
4. 自定义插件绑定
可以在 pom.xml 中自定义插件绑定到特定阶段:
xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>echo-message</id>
<phase>compile</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>Hello from AntRun Plugin!</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Maven 的生命周期和插件机制提供了强大的构建自动化能力,通过合理的配置可以满足各种复杂的构建需求。
其他构建框架
除了Maven之外,Java生态中还有多种仓库管理工具,每种工具都有其独特的特点和适用场景。
- Ant 是最早的构建工具,专注于通过XML脚本实现项目构建自动化,但缺乏内置的依赖管理功能56
- Ivy 是依赖管理工具,通常与Ant配合使用,为Ant项目提供依赖管理能力12
- Maven 在Ant基础上发展而来,集成了依赖管理、项目结构约定和构建生命周期,采用"约定优于配置"原则45
- Gradle 融合了Ant的灵活性和Maven的依赖管理,使用Groovy/Kotlin DSL,提供了更强大的构建能力34