1. 编译(Compile)
作用
将人类编写的 源代码(.java 文件) 转换成 机器/虚拟机可理解的格式(.class 字节码文件)。
输入:src/main/java/**/*.java(你的 Java 源代码)。
输出:target/classes/**/*.class(编译后的字节码文件)。
核心特点
由编译器完成:Maven 默认使用 JDK 的 javac 编译器。
静态检查:编译时会检查语法错误(如缺少分号、类型不匹配等),但不会执行代码逻辑。
必要前置步骤:只有编译成功后,才能运行或打包代码。
Maven 命令
mvn compile # 仅编译主代码(不编译测试代码)
2. 运行(Run)
作用
执行编译后的程序,让代码逻辑真正跑起来(比如启动一个 Spring Boot 应用或运行 main() 方法)。
输入:target/classes/ 中的 .class 文件。
输出:程序的实际行为(如控制台输出、服务启动等)。
核心特点
需要 JVM:Java 程序必须通过 Java 虚拟机(JVM)运行。
动态行为:运行时才会触发代码逻辑(如计算、网络请求、数据库操作等)。
依赖编译产物:如果没有先编译(或编译失败),运行时会报错(如 ClassNotFoundException)。
运行方式
普通 Java 程序
# 先编译
mvn compile
# 再运行(指定包含 main() 的类)
java -cp target/classes com.example.Main
Spring Boot 项目:
mvn spring-boot:run # 直接编译+运行(内部会处理依赖)
3. 编译 vs 运行的关键区别
特性编译(Compile)运行(Run)输入.java 源代码文件.class 字节码文件输出.class 字节码文件程序的实际行为(如控制台输出、服务响应)工具JDK 的 javac 编译器JVM(Java 虚拟机)错误类型语法错误(如缺少分号)逻辑错误(如空指针异常)Maven 阶段compile(生命周期早期阶段)无单独阶段,通常通过插件(如 spring-boot:run)或手动执行
4. 通过简单例子理解
假设有一个简单的 Java 程序:
// src/main/java/com/example/HelloWorld.java
package com.example;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Maven!");
}
}
编译阶段
执行 mvn compile 后:
生成 target/classes/com/example/HelloWorld.class。
如果代码有语法错误(比如漏写分号),编译会失败。
运行阶段
执行 java -cp target/classes com.example.HelloWorld:
JVM 加载 HelloWorld.class 并执行 main() 方法。
输出:Hello, Maven!。
5. 常见问题
Q1:为什么修改代码后要重新编译?
因为 JVM 只认 .class 文件。如果你改了 .java 文件但没重新编译,运行的仍是旧的 .class 文件。
Q2:mvn test 是否包含编译?
是的!mvn test 会先自动编译主代码和测试代码,再运行测试。
Q3:Maven 如何知道何时需要重新编译?
Maven 会比较源代码和 .class 文件的时间戳。如果 .java 文件比 .class 文件新,则会重新编译。
总结
编译:将源代码转为字节码(静态转换,检查语法)。
运行:执行字节码(动态行为,检查逻辑)。
Maven 自动化:大多数命令(如 package、install)已隐含了编译步骤,无需手动分开执行。
理解这两个概念后,你就知道为什么有时候代码改了但没生效(可能忘了重新编译),或者为什么运行时报错但编译却通过了(运行时逻辑问题)!
6. 实际操作流程(常见情况讲解):
问题:那如果我已经编译过一次,现在修改了代码,我应该怎么做
解答:
6.1. 基础操作:重新编译并运行
▶ 方式一:手动重新编译
# 重新编译主代码(生成新的 .class 文件)
mvn compile
# 重新运行程序(根据项目类型选择)
java -cp target/classes com.example.Main # 普通Java项目
mvn spring-boot:run # Spring Boot项目
▶ 方式二:使用组合命令(推荐)
Maven 会自动检测代码变化,但为了确保完全重新构建,建议组合使用 clean:
# 清理旧编译结果 + 重新编译 + 运行
mvn clean compile
mvn spring-boot:run
6.2. 不同场景下的操作
场景 1:仅修改了主代码(非测试代码)
直接重新编译主代码即可:
mvn compile
场景 2:修改了测试代码
需要重新编译测试代码并运行测试:
mvn test-compile # 仅编译测试代码
mvn test # 运行测试
场景 3:需要打包或安装
如果改动涉及依赖或需要分发给其他模块:
mvn clean package # 重新打包
mvn clean install # 重新安装到本地仓库
6.3. 自动化工具辅助
▶ IDE 自动编译(推荐)
Eclipse/IntelliJ IDEA:默认会实时编译保存的代码(需开启自动构建)。
手动触发:在 IDEA 中按 Ctrl+F9(Windows)或 Cmd+F9(Mac)。
6.4.常见问题
问题 1:代码改了但运行结果没变
原因:未重新编译,或编译失败但未报错。
解决:
mvn clean compile # 强制清理并重新编译
问题 2:依赖其他模块的代码未更新
原因:依赖的模块未重新安装到本地仓库。
解决:
在依赖模块中执行:
mvn clean install # 更新本地仓库中的依赖
问题 3:测试失败导致构建中断
解决:
mvn package -DskipTests # 跳过测试
6.5. 高效开发技巧
增量编译:
默认情况下,Maven 只会重新编译修改过的文件(通过时间戳判断)。
但为了保险,重大改动后建议用 clean。
快捷键:
IDEA/Eclipse 的 Build Project 功能(等同于 mvn compile)。
热部署:
Spring Boot 项目用 spring-boot-devtools,修改代码后自动重启。
6.6.总结
操作命令适用场景重新编译主代码mvn compile仅修改了主代码重新编译并运行mvn clean compile && mvn spring-boot:run确保完全重新构建重新安装到本地仓库mvn clean install修改的代码被其他模块依赖时IDE 自动编译保存文件或按 Ctrl+F9日常开发中快速验证改动
记住原则:
✅ 小改动 → 直接运行(IDE 或 Maven 会自动编译)。
✅ 重大改动 → clean + 重新编译。
✅ 涉及依赖 → install 更新本地仓库。