bas - Maven基础配置与仓库
Maven 基础配置与仓库
阅读顺序:基础、POM 与仓库 → 依赖、生命周期与插件 → 多模块、版本与私服
Maven 不只是“下载 JAR 包”的工具。它用 pom.xml 描述项目模型,用坐标定位构件,用仓库解析依赖,用生命周期安排构建顺序,再由插件完成编译、测试、打包与发布。
先建立整体心智模型
| 概念 | 解决的问题 | 典型位置 |
|---|---|---|
| POM | 这个项目是什么、需要什么、怎样构建 | pom.xml |
| 坐标 | 如何唯一定位一个构件 | groupId:artifactId:version |
| 仓库 | 构件从哪里下载、向哪里发布 | 本地、中央、镜像、私服 |
| 依赖 | 编译、测试和运行需要什么 | <dependencies> |
| 生命周期 | 构建按什么顺序推进 | compile、test、verify |
| 插件 | 每个阶段具体做什么 | <build><plugins> |
| Reactor | 多模块按什么顺序一起构建 | <modules> 与模块依赖图 |
一句话区分:POM 描述“构建什么”,生命周期规定“何时做”,插件负责“具体怎么做”。
约定优于配置
Maven 默认认识下面的目录,不需要逐项告诉它源码在哪里:
目录可以改,但会增加插件配置和协作成本;没有明确理由就遵守约定。
Maven 实际执行的不是肉眼看到的单个 POM,而是 Super POM + 父 POM + 当前 POM + 激活的 Profile 合并后的有效模型。查看最终结果:
代码块收起展开
mvn help:effective-pom
mvn help:effective-settings仓库
仓库用于保存 JAR、POM、插件等构件。Maven 解析依赖时先查本地仓库,本地未命中才访问远程仓库。
| 类型 | 位置与作用 |
|---|---|
| 本地仓库 | 当前电脑的缓存,默认 ${user.home}/.m2/repository |
| 中央仓库 | Maven 官方公共仓库,保存开源构件 |
| 镜像 | 替换某些远程仓库的访问入口,常用于加速 |
| 私服 | 公司内部的代理与构件仓库,如 Nexus、Artifactory |
mvn install:把当前项目构件写入本地仓库。mvn deploy:把构件上传到 POM 配置的远程仓库。
坐标
坐标是构件在仓库中的唯一地址,最核心的是 groupId:artifactId:version。
| 字段 | 含义 | 示例 |
|---|---|---|
groupId | 组织或项目组,常用域名反写 | org.slf4j |
artifactId | 模块或构件名 | slf4j-api |
version | 构件版本 | 2.0.16 |
type | 构件类型,默认 jar | jar、pom、war |
classifier | 同版本的附加变体 | sources、javadoc |
代码块收起展开
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.16</version>
</dependency>坐标会转换成仓库路径,例如 org.slf4j:slf4j-api:2.0.16 对应 org/slf4j/slf4j-api/2.0.16/。课程中常见的 log4j:log4j:1.2.17 已非常老且存在安全风险,不应作为新项目依赖。
基本配置
Maven 有两层 settings.xml:
- 全局配置:
${maven.home}/conf/settings.xml。 - 用户配置:
${user.home}/.m2/settings.xml,个人机器通常改这一份。
自定义本地仓库:
代码块收起展开
<settings xmlns=http://maven.apache.org/SETTINGS/1.2.0>
<localRepository>D:/maven/repository</localRepository>
</settings>中央仓库访问较慢时,可在 settings.xml 中配置镜像:
代码块收起展开
<mirrors>
<mirror>
<id>aliyun-public</id>
<name>Aliyun public mirror</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>mirrorOf=central 只替换中央仓库;mirrorOf=* 会替换所有远程仓库。镜像是“替换访问入口”,不是单纯追加一个仓库,公司有私服时尤其不能盲目使用 *。
最小 POM 骨架:
代码块收起展开
<project xmlns=http://maven.apache.org/POM/4.0.0>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<maven.compiler.release>17</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 项目依赖 -->
</dependencies>
<build>
<plugins>
<!-- 构建插件 -->
</plugins>
</build>
</project>packaging 省略时默认是 jar;聚合父工程通常使用 pom,传统 Web 工程可能使用 war。
构建命令
| 命令 | 作用 |
|---|---|
mvn clean | 删除 target |
mvn compile | 编译主代码 |
mvn test | 编译并运行单元测试 |
mvn package | 测试后生成 JAR/WAR |
mvn verify | 继续执行集成检查 |
mvn install | 安装到本地仓库 |
mvn deploy | 发布到远程仓库 |
日常完整校验优先使用:
代码块收起展开
mvn clean verify执行某个阶段,会自动执行同一生命周期中它之前的阶段;clean 属于另一套生命周期,所以通常显式写在前面。
先确认实际环境
代码块收起展开
mvn -v
mvn help:effective-settings
mvn help:effective-pom
mvn help:active-profilesmvn -v 显示 Maven 实际使用的 JDK 与 Java Home,它比只看 IDE 设置更可靠。
Maven Wrapper
Wrapper 把 Maven 版本随项目固定下来,减少“我的电脑可以构建”的差异:
代码块收起展开
mvn wrapper:wrapper
# Windows
mvnw.cmd clean verify
# macOS / Linux
./mvnw clean verify团队项目应提交 .mvn/wrapper/、mvnw 与 mvnw.cmd,但不要提交本地 .m2/ 或构建产物 target/。