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!");
    }
}

 

  1. 编译阶段

    • 执行 mvn compile 后:

      • 生成 target/classes/com/example/HelloWorld.class

      • 如果代码有语法错误(比如漏写分号),编译会失败。

  2. 运行阶段

    • 执行 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 自动化:大多数命令(如 packageinstall)已隐含了编译步骤,无需手动分开执行。

理解这两个概念后,你就知道为什么有时候代码改了但没生效(可能忘了重新编译),或者为什么运行时报错但编译却通过了(运行时逻辑问题)! 

 

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. 高效开发技巧
  1. 增量编译

    • 默认情况下,Maven 只会重新编译修改过的文件(通过时间戳判断)。

    • 但为了保险,重大改动后建议用 clean

  2. 快捷键

    • IDEA/Eclipse 的 Build Project 功能(等同于 mvn compile)。

  3. 热部署

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值