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
更新本地仓库。