maven简介
Maven 全面解析:从基础概念到项目管理实践
Maven 作为 Java 生态中主流的项目管理工具,通过标准化的项目结构、依赖管理和构建流程,极大简化了项目的开发与维护。本文将从 Maven 的核心概念、项目构建、目录结构、依赖管理等方面进行全面讲解,帮助你快速掌握 Maven 的使用。
Maven 核心概念
项目对象模型(POM)
Maven 基于 Project Object Model(POM) 管理项目,所有配置都集中在 pom.xml 文件中。POM 定义了项目的基本信息(如坐标、名称)、依赖、插件、构建规则等,是 Maven 项目的 “灵魂”。
一个简单的 pom.xml 示例:
<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.zhanghe</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <!-- 打包方式:jar/war/pom 等 -->
<name>test</name>
<description>A simple Maven project</description>
</project>
所有的pom都继承自一个父POM,其中包含了一些可以被继承的默认设置
查看父pom的默认配置
mvn help:effctive-pom
依赖管理
Maven 通过坐标唯一标识并管理依赖(如第三方 Jar 包),避免手动下载和导入 Jar 包的繁琐。坐标由以下 4 个元素组成:
| 元素 | 含义 | 示例 |
|---|---|---|
groupId |
组织 / 公司标识(通常为域名倒序) | com.zhanghe、org.springframework |
artifactId |
项目 / 模块标识 | test、spring-core |
version |
版本号(SNAPSHOT 表示快照版,RELEASE 表示稳定版) |
1.0-SNAPSHOT、5.3.20.RELEASE |
packaging |
打包方式(默认 jar,Web 项目用 war) |
jar、war |
示例:在 pom.xml 中添加 Spring 依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.20.RELEASE</version>
</dependency>
</dependencies>
仓库(Repository)
Maven 仓库用于存储依赖包,按存储位置分为三类:
(1)本地仓库
位于本地计算机的目录(默认
~/.m2/repository),用于缓存从远程仓库下载的依赖。可在 Maven 配置文件settings.xml中自定义路径:
<localRepository>/path/to/your/local/repo</localRepository>
(2)远程仓库
- 私服:公司 / 团队内部搭建的仓库(如 Nexus),用于管理内部依赖,避免重复下载。
- 第三方仓库:如阿里云、JBoss 等提供的公共仓库,补充中央仓库的不足。
在 pom.xml 中配置远程仓库:
<repositories>
<repository>
<id>aliyun</id>
<name>Aliyun Repository</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases><enabled>true</enabled></releases> <!-- 允许下载正式版 -->
<snapshots><enabled>true</enabled></snapshots> <!-- 允许下载快照版 -->
</repository>
</repositories>
(3)中央仓库
- Maven 官方维护的仓库(
https://repo.maven.apache.org/maven2),包含绝大多数开源依赖。 - 无需手动配置,Maven 会默认从中央仓库下载依赖(若本地和远程仓库无对应依赖)。
依赖搜索顺序
Maven 查找依赖时,按以下顺序依次检索:
- 本地仓库 → 2. 项目
pom.xml配置的远程仓库 → 3. 私服 → 4. 中央仓库
Maven 项目构建
使用命令创建项目
通过 mvn archetype:generate 命令基于骨架(Archetype) 快速创建项目:
(1)创建普通 Java 项目
mvn archetype:generate \
-DgroupId=com.zhanghe \ # 组织标识
-DartifactId=test \ # 项目名称
-DarchetypeArtifactId=maven-archetype-quickstart \ # 骨架类型
-Dversion=1.0-SNAPSHOT \ # 版本号
-DinteractiveMode=false # 非交互模式(无需手动确认)
(2)创建 Web 项目
mvn archetype:generate \
-DgroupId=com.zhanghe \
-DartifactId=web-demo \
-DarchetypeArtifactId=maven-archetype-webapp \ # Web 项目骨架
-Dversion=1.0-SNAPSHOT \
-DinteractiveMode=false
标准项目目录结构
Maven 定义了统一的目录结构,确保项目的一致性和可维护性:
test-project/ # 项目根目录
├── pom.xml # POM 配置文件
├── src/
│ ├── main/ # 主程序代码
│ │ ├── java/ # Java 源代码(包结构在此目录下)
│ │ ├── resources/ # 资源文件(如配置文件、静态资源)
│ │ └── webapp/ # Web 项目特有(JSP、CSS、JS 等,对应 WAR 包根目录)
│ └── test/ # 测试代码
│ ├── java/ # 测试类(如 JUnit 测试)
│ └── resources/ # 测试资源文件
└── target/ # 构建输出目录(自动生成,包含 class、Jar/WAR 包等)
自定义目录结构
若需修改默认目录(如源码路径),可在 pom.xml 的 <build> 中配置:
<build>
<sourceDirectory>src/main/custom-java</sourceDirectory> <!-- 自定义源码目录 -->
<resources>
<resource>
<directory>src/main/custom-resources</directory> <!-- 自定义资源目录 -->
</resource>
</resources>
</build>
核心配置与属性
全局属性配置
在 pom.xml 的 <properties> 中定义属性,可简化版本管理和配置复用:
<properties>
<!-- 编码格式 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- JDK 版本 -->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- 依赖版本(复用) -->
<spring.version>5.3.20.RELEASE</spring.version>
</properties>
<!-- 使用属性 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version> <!-- 引用属性 -->
</dependency>
</dependencies>
插件配置
Maven 通过插件实现构建功能(如编译、打包、测试),插件配置在 <build><plugins> 中:
示例:配置编译插件(指定 JDK 版本):
<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> <!-- 编译后 class 兼容版本 -->
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
镜像配置(加速依赖下载)
中央仓库在国外,下载速度慢,可配置国内镜像(如阿里云)加速:
在 Maven 全局配置文件 settings.xml(位于 ~/.m2/settings.xml 或 MAVEN_HOME/conf/settings.xml)中添加:
<mirrors>
<mirror>
<id>aliyun-maven</id>
<name>Aliyun Maven Mirror</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf> <!-- 镜像中央仓库 -->
</mirror>
</mirrors>
常用 Maven 命令
| 命令 | 功能描述 |
|---|---|
mvn clean |
清理 target 目录(删除编译生成的文件) |
mvn compile |
编译主程序代码(生成 target/classes) |
mvn test |
运行测试用例(需先编译,生成 target/test-classes) |
mvn package |
打包项目(生成 Jar/WAR 包到 target 目录) |
mvn install |
将项目安装到本地仓库(供其他项目依赖) |
mvn deploy |
将项目部署到远程仓库(如私服) |
mvn archetype:generate |
创建新 Maven 项目(基于骨架) |
mvn help:effective-pom |
查看当前项目的有效 POM(包含继承的配置) |