Apache Maven
项目对象模型(POM,Project Object Model) 的 构建自动化工具,主要用于 Java 项目 的依赖管理、构建、测试和部署。它简化了项目的构建流程,提供了一套标准化的项目结构和构建生命周期。
类似工具 Ant、Gradle。
标准项目结构
project ← 项目根目录
├── pom.xml ← 项目核心配置文件(必须)
├── src ← 源代码目录
│ ├── main ← 主代码(编译后包含在最终产物中)
│ │ ├── java ← Java 源代码(包路径从该目录开始)
│ │ ├── resources ← 资源文件(如配置文件、静态资源)
│ │ └── webapp ← Web 项目特有(存放 WEB-INF/、JSP 等)
│ └── test ← 测试代码(不参与打包)
│ ├── java ← 测试用的 Java 代码
│ └── resources ← 测试用的资源文件
└── target ← 输出目录(由 Maven 自动生成,存放编译结果)
├── classes ← 编译后的 .class 文件
├── test-classes ← 测试代码的编译结果
└── project.jar ← 打包生成的 JAR/WAR 文件
构建生命周期 (Build Lifecycle)
命令 | 作用 |
---|---|
mvn clean | 清理 target 目录 |
mvn compile | 编译源代码 |
mvn test | 运行单元测试 |
mvn package | 打包(JAR/WAR) |
mvn install | 安装到本地仓库 |
mvn deploy | 部署到远程仓库(如 Nexus) |
settings.xml
xml
<?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>${user.home}/.m2/repository</localRepository>
<pluginGroups></pluginGroups>
<proxies></proxies>
<servers></servers>
<mirrors>
<!-- public 镜像代理 -->
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
<!-- 如果想使用其它代理仓库,可在<repositories></repositories>节点中加入对应的仓库使用地址。以使用 central 代理仓为例 -->
<profiles>
<profile>
<repositories>
<repository>
<id>central</id>
<url>https://maven.aliyun.com/repository/central</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>central</activeProfile>
</activeProfiles>
</settings>
阿里云中央仓库
https://maven.aliyun.com/mvn/guide
POM(Project Object Model)
Maven 的核心配置文件,定义了项目的基本信息、依赖、插件、构建配置等。
xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-project</artifactId>
<version>1.0.0</version>
<!-- 赖管理(Dependency Management)
Maven 自动从中央仓库(或配置的私有仓库)下载依赖(JAR 文件)。
<dependencies> 声明依赖,支持传递性依赖(自动解析依赖的依赖)。
-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- 依赖范围 <scope>
compile:默认,编译和运行都需要
test:仅测试阶段使用,如 JUnit
provided:由 JDK 或容器提供,如 Servlet API
-->
<scope>test</scope>
</dependency>
</dependencies>
</project>
安装
sh
# 获取压缩包
wget https://mirrors.ustc.edu.cn/apache/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
curl -Os https://mirrors.ustc.edu.cn/apache/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
# 配置
export JAVA_HOME="/path/to/java/dirctory"
export M2_HOME="/path/to/maven/dirctory"
export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
# test
$ java -version
$ mvn -v
mvn package [option]
mvn clean package
清理并打包
可选项 | 缩写 | 说明 |
---|---|---|
-DskipTests | - | 跳过测试(编译测试代码但不执行) |
-Dmaven.test.skip=true | - | 完全跳过测试(不编译也不执行测试) |
-P<profile-id> | - | 激活指定的 Profile(如 -Pprod 激活 prod 环境配置) |
-pl <module> | - | 仅构建指定模块(适用于多模块项目,如 -pl module1 ) |
-am | - | 同时构建依赖的模块(与 -pl 一起使用) |
-T <threads> | - | 并行构建(如 -T 4 使用 4 个线程加速构建) |
-f <pom-file> | - | 指定自定义 pom.xml (如 -f submodule/pom.xml ) |
-e | - | 显示详细错误信息(调试时有用) |
-X | - | 启用调试模式(输出更详细的日志) |
--offline | - | 离线模式(仅使用本地仓库,不联网下载依赖) |
FAQ
3.8.1 版本之后,默认拒绝非 https 远端仓库。
xml
<!-- 1.许可 http 协议 -->
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:dummy:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror>