bas - Maven基础配置与仓库

Maven 基础配置与仓库

阅读顺序:基础、POM 与仓库依赖、生命周期与插件多模块、版本与私服

Maven 不只是“下载 JAR 包”的工具。它用 pom.xml 描述项目模型,用坐标定位构件,用仓库解析依赖,用生命周期安排构建顺序,再由插件完成编译、测试、打包与发布。

先建立整体心智模型

概念解决的问题典型位置
POM这个项目是什么、需要什么、怎样构建pom.xml
坐标如何唯一定位一个构件groupId:artifactId:version
仓库构件从哪里下载、向哪里发布本地、中央、镜像、私服
依赖编译、测试和运行需要什么<dependencies>
生命周期构建按什么顺序推进compiletestverify
插件每个阶段具体做什么<build><plugins>
Reactor多模块按什么顺序一起构建<modules> 与模块依赖图

一句话区分:POM 描述“构建什么”,生命周期规定“何时做”,插件负责“具体怎么做”。

约定优于配置

Maven 默认认识下面的目录,不需要逐项告诉它源码在哪里:

Maven 约定目录结构

目录可以改,但会增加插件配置和协作成本;没有明确理由就遵守约定。

Maven 实际执行的不是肉眼看到的单个 POM,而是 Super POM + 父 POM + 当前 POM + 激活的 Profile 合并后的有效模型。查看最终结果:

代码块BASH · 2 行收起展开
mvn help:effective-pom
mvn help:effective-settings

仓库

仓库用于保存 JAR、POM、插件等构件。Maven 解析依赖时先查本地仓库,本地未命中才访问远程仓库。

maven-repository
类型位置与作用
本地仓库当前电脑的缓存,默认 ${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构件类型,默认 jarjarpomwar
classifier同版本的附加变体sourcesjavadoc
代码块XML · 5 行收起展开
<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,个人机器通常改这一份。

自定义本地仓库:

代码块XML · 3 行收起展开
<settings xmlns=http://maven.apache.org/SETTINGS/1.2.0>
    <localRepository>D:/maven/repository</localRepository>
</settings>

中央仓库访问较慢时,可在 settings.xml 中配置镜像:

代码块XML · 8 行收起展开
<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 骨架:

代码块XML · 21 行收起展开
<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发布到远程仓库

日常完整校验优先使用:

代码块BASH · 1 行收起展开
mvn clean verify

执行某个阶段,会自动执行同一生命周期中它之前的阶段;clean 属于另一套生命周期,所以通常显式写在前面。

先确认实际环境

代码块BASH · 4 行收起展开
mvn -v
mvn help:effective-settings
mvn help:effective-pom
mvn help:active-profiles

mvn -v 显示 Maven 实际使用的 JDK 与 Java Home,它比只看 IDE 设置更可靠。

Maven Wrapper

Wrapper 把 Maven 版本随项目固定下来,减少“我的电脑可以构建”的差异:

代码块BASH · 7 行收起展开
mvn wrapper:wrapper

# Windows
mvnw.cmd clean verify

# macOS / Linux
./mvnw clean verify

团队项目应提交 .mvn/wrapper/mvnwmvnw.cmd,但不要提交本地 .m2/ 或构建产物 target/

延伸阅读