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
结合场景再看三个关注点
- 约定优于配置减少脚本。
- 依赖传递要用
dependency:tree审计。 - compiler release 固定字节码目标。
核心概念与准确模型
1. 坐标与仓库
- 本地仓库
~/.m2 - 中央/私服
2. 依赖范围
compile / provided / runtime / test / system…
3. 生命周期与插件
阶段绑定默认插件;可配置 surefire、failsafe、shade 等。
4. BOM 与 dependencyManagement
多模块版本对齐。
边界情况与反直觉行为
- 传递依赖版本冲突取“近者优先”等规则——要会看 tree。
- 插件版本不锁可能导致 CI 漂移。
- 与 Gradle 互操作发布仍靠 Maven 坐标生态。
常见误区
[!warning] 常见误区:盲加依赖不看许可证与传递树 供应链与体积风险。
工程实践
- 锁插件版本。
- 用 wrapper(
mvnw)。 - 失败构建保留 surefire 报告。
- 多模块按边界拆 reactor。
本节总结
- POM+生命周期+约定目录
- 坐标生态是 Java 依赖中心
- 会读 dependency tree
自测题
mvn package默认跑测试吗?- test scope 依赖为何不进主产物?
参考答案
- 默认会执行 test 阶段(可用跳过开关,但不建议常态)。
- 范围限制传递与打包,仅测试编译/运行可见。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| Maven Users Centre | 官方 | 指南 |
| POM Reference | 官方 | 模型 |