Maven基础---“编译”“运行”一次性说清楚

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