Maven 基础

Maven 坐标、生命周期与依赖管理:如何用约定构建、测试与打包 Java 项目。

#type / concept #status / growing #tech / dev #resource / java

[!info] 关联笔记

Maven 基础

这个概念为什么出现

多模块、第三方依赖、测试与打包不能靠手工 javac。Maven 以 POM 坐标 + 约定目录 + 生命周期 成为 Java 构建事实标准之一。

[!abstract] 一句话理解 Maven 用 groupId:artifactId:version 管理构件,用标准生命周期(validate→compile→test→package→…)与插件执行构建;pom.xml 是项目模型。

最小可运行示例

场景:新建最小库/应用 POM 骨架(命令示意)

<!-- pom.xml 关键片段 -->
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>shop</groupId>
  <artifactId>order-service</artifactId>
  <version>0.1.0</version>
  <properties>
    <maven.compiler.release>21</maven.compiler.release>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
</project>

常用命令:

mvn -q -DskipTests package
mvn test
mvn dependency:tree

目录约定:

src/main/java
src/main/resources
src/test/java

结合场景再看三个关注点

  1. 约定优于配置减少脚本。
  2. 依赖传递要用 dependency:tree 审计。
  3. compiler release 固定字节码目标。

核心概念与准确模型

1. 坐标与仓库

  • 本地仓库 ~/.m2
  • 中央/私服

2. 依赖范围

compile / provided / runtime / test / system…

3. 生命周期与插件

阶段绑定默认插件;可配置 surefire、failsafe、shade 等。

4. BOM 与 dependencyManagement

多模块版本对齐。

边界情况与反直觉行为

  1. 传递依赖版本冲突取“近者优先”等规则——要会看 tree。
  2. 插件版本不锁可能导致 CI 漂移。
  3. 与 Gradle 互操作发布仍靠 Maven 坐标生态。

常见误区

[!warning] 常见误区:盲加依赖不看许可证与传递树 供应链与体积风险。

工程实践

  1. 锁插件版本。
  2. 用 wrapper(mvnw)。
  3. 失败构建保留 surefire 报告。
  4. 多模块按边界拆 reactor。

本节总结

  • POM+生命周期+约定目录
  • 坐标生态是 Java 依赖中心
  • 会读 dependency tree

自测题

  1. mvn package 默认跑测试吗?
  2. test scope 依赖为何不进主产物?
参考答案
  1. 默认会执行 test 阶段(可用跳过开关,但不建议常态)。
  2. 范围限制传递与打包,仅测试编译/运行可见。

延伸阅读与资料来源

资料类型支撑内容
Maven Users Centre官方指南
POM Reference官方模型
创建于 2026/7/15 更新于 2026/7/15