maven的lifecycle
在 IntelliJ IDEA 中,Maven 的 Lifecycle 包含一系列构建阶段(phase),每个按钮对应一个阶段。按执行顺序(从前往后)依次是:
-
clean
-
作用 :删除
target目录,清理上一次构建生成的所有文件。 -
典型场景:解决缓存问题、确保全新构建。
-
-
validate
-
作用:验证项目结构、依赖等信息是否正确,所有必要信息是否就绪。
-
典型场景:CI 流水线早期检查。
-
-
compile
-
作用 :编译
src/main/java下的源码,生成.class文件到target/classes。 -
典型场景:仅编译,不打包。
-
-
test
-
作用 :执行
src/test/java中的单元测试(不会打包或部署)。 -
典型场景:在编译后验证代码逻辑正确性。
-
-
package
-
作用:将编译好的代码打包成可分发的格式(如 JAR、WAR)。
-
典型场景:生成本地可运行的交付物。
-
-
verify
-
作用:对打包结果进行验证(例如运行集成测试、检查质量阈值)。
-
典型场景:在发布前做完整检查。
-
-
install
-
作用 :将当前项目的 JAR/WAR 安装到本地 Maven 仓库(
~/.m2/repository)。 -
典型场景:让其他本地项目能依赖本模块。
-
-
site
-
作用 :生成项目报告和文档网站(默认在
target/site)。 -
典型场景:生成 API 文档、测试报告等。
-
-
deploy
-
作用:将最终包复制到远程 Maven 仓库(如 Nexus、Artifactory)。
-
典型场景:正式发布版本供团队共享。
-
maven的compile与idea的run 按钮的具体区别
关键规则
-
按顺序执行 :双击后面的阶段(如
package)会自动执行它前面的所有阶段(validate、compile、test等),但不会 执行clean。 -
clean 独立 :
clean不在默认生命周期链中,通常先执行clean,再执行其他阶段(例如clean compile)。 -
IDEA 快捷操作:
-
可以按住
Ctrl(Windows/Linux)或Cmd(Mac)多选阶段一次性执行。 -
常用组合:
clean+install或clean+package。
-
举例
-
只想编译 → 点
compile -
想打包但不测试 → 右键
package→Run Maven Build→ 在对话框填package -DskipTests -
想全新打包并安装到本地 → 先点
clean,再点install
1. 本质与范围
-
Maven Compile :严格按照 Maven 生命周期执行。只编译
src/main/java下的代码到target/classes,不会 处理资源文件(如src/main/resources)?实际上 Maven Compile 默认会复制资源文件,但不会进行增量编译。 -
IDEA Run :调用 IDEA 自身的构建系统。它会编译整个项目的源代码(包括
src/main/java和src/test/java),并将所有资源文件和编译后的类输出到 IDEA 指定的输出目录(通常是/target/classes或/out/production/模块名),同时支持增量编译(只编译修改过的文件)。
2. 依赖处理
-
Maven Compile :完全依赖 Maven 的依赖解析机制 。如果本地仓库(
~/.m2/repository)没有所需的 JAR 包,它会从远程仓库下载。如果依赖关系有问题(比如版本冲突),它会报错。 -
IDEA Run :依赖 IDEA 的模块路径 。它直接使用项目设置的模块依赖(通常是从 Maven 模型导入的),但 IDEA 可能会缓存依赖关系。如果 IDEA 的缓存与
pom.xml不同步,可能导致运行时ClassNotFoundException。
3. 编译速度与智能
-
Maven Compile :全量编译,每次都会重新编译所有源代码(除非使用增量编译插件)。速度较慢,但结果可靠(因为与 CI/CD 服务器上的行为完全一致)。
-
IDEA Run :增量编译,只编译修改过的文件和受影响的类。速度极快,非常适合频繁运行单元测试或启动应用程序。同时,IDEA 会实时分析代码(高亮错误、提供代码补全)。
4. 触发时机与用途
-
Maven Compile:
-
手动触发 :当你点击 Lifecycle 中的
compile时。 -
用途:
-
在 CI/CD 流水线中(如 Jenkins、GitHub Actions)确保构建一致。
-
解决 IDEA 缓存问题导致的奇怪错误(通过 Maven 重新编译可以"重置"状态)。
-
验证
pom.xml中的依赖配置是否正确。
-
-
-
IDEA Run:
-
自动/手动触发:
-
当你点击工具栏的绿色三角形(Run)或 Debug 图标时。
-
当你按
Ctrl+Shift+F10(运行当前主类或测试方法)时。 -
当你保存文件时(IDEA 默认自动编译,可在设置中调整)。
-
-
用途:
-
日常开发:快速运行
main方法、单元测试、Spring Boot 应用等。 -
调试代码:设置断点、单步执行。
-
-
5. 错误处理
-
Maven Compile:遇到第一个编译错误就停止,并报告清晰的错误信息(包括缺失依赖、语法错误等)。
-
IDEA Run :会尝试在后台持续编译,即使有错误也可能允许你运行(但运行时会报错)。IDEA 的错误标记(红色波浪线)通常更直观,但有时会滞后(需要
Reload Maven Project)。
总结表
| 特性 | Maven Compile | IDEA Run |
|---|---|---|
| 底层工具 | Maven (独立构建工具) | IntelliJ IDEA 编译器 (内置) |
| 编译方式 | 全量编译(默认) | 增量编译(默认) |
| 依赖管理 | 重新解析 Maven 依赖 | 使用 IDEA 缓存的模块路径 |
| 资源处理 | 复制 src/main/resources 到 target/classes |
复制资源文件到输出目录 |
| 测试代码 | 不编译测试代码 | 编译测试代码(但通常不运行) |
| 速度 | 慢(尤其是首次或 clean 后) | 快(日常开发首选) |
| 可靠性 | 与 CI/CD 完全一致 | 可能与 Maven 行为有细微差异 |
| 典型场景 | 正式构建、验证依赖、解决缓存问题 | 日常编码、运行/调试应用、单元测试 |
实践建议
-
日常开发:直接用 IDEA Run(绿色三角形)。速度快,支持增量编译和调试。
-
遇到诡异问题 (如"找不到符号"但代码明明正确):先执行 Maven Compile。如果 Maven 报错,说明
pom.xml或依赖有问题;如果 Maven 成功但 IDEA Run 失败,尝试File→Invalidate Caches...或Reload Maven Project。 -
CI/CD 构建 :必须使用 Maven Compile(或更高阶段如
package、install),因为服务器上没有 IDEA。
补充:Maven 其他阶段与 IDEA Run 的关系
-
Maven Test :运行
src/test/java下的单元测试(基于 Surefire 插件),会生成报告。 -
IDEA Run Test :直接运行测试方法,支持调试,但不会生成 Maven 风格的测试报告(
target/surefire-reports)。