一、背景问题

在实际开发中,经常会遇到这样的场景:

  • 系统默认 JDK 是 JDK17

  • 但某些老项目必须用 JDK8 打包

  • 使用 VSCode 进行开发和 Debug

这时就会产生几个典型疑问:

  1. VSCode 能不能指定 Maven 使用的 JDK?

  2. Debug 时到底是谁在编译?

  3. .class 文件到底放在哪里?

  4. 为什么看不到 bin/out/ 目录?

这篇文章帮你彻底讲清楚这些问题。


二、VSCode 到底是谁在“编译”?

很多人误以为:

VSCode 是编译器 ❌

其实:

VSCode 只是一个编辑器,真正编译的是后面的工具

分三种情况:


1️⃣ 普通 Java 项目(非 Maven)

流程:

VSCode → Java 插件 → javac
  • 使用 JDK 自带的 javac

  • 输出目录:bin/out/


2️⃣ Maven 项目(重点)

流程:

VSCode → Maven → javac

或者 Debug 时:

VSCode → Java 插件 → javac(不一定走 Maven)

👉 关键点:

Maven 项目 ≠ 一定用 Maven 编译


三、Debug 时到底用谁编译?

✅ 结论

默认 Debug 不走 Maven,而是 VSCode 自己调用 javac


🔍 实际流程

点击 Debug 时:

VSCode
  ↓
Java 插件
  ↓
javac 编译
  ↓
运行 JVM

👉 注意:

  • 没有执行 mvn compile

  • 属于“快速编译 + 运行”


⚠️ 带来的问题

如果你环境是:

  • Maven 用 JDK8

  • VSCode 用 JDK17

就会出现:

场景 JDK
mvn package JDK8
Debug JDK17

👉 可能导致:

  • 本地运行 OK

  • 打包后报错


四、class 文件到底在哪?

1️⃣ 普通 Java 项目

默认:

bin/
或
out/

2️⃣ Maven 项目(你的情况)

你会发现:

👉 没有 bin/out!

这是正常的 ✔


📌 原因

因为 VSCode 识别到你是 Maven 项目(有 pom.xml)后:

自动对齐 Maven 目录结构


✅ 实际使用目录

target/classes/

🔎 验证方法

dir target\classes

或者:

target/classes/xxx.class

五、为什么没有 bin/out?

总结一句话:

Maven 项目默认使用 target 目录,VSCode 不再使用 bin/out


对比总结

项目类型 class 输出目录
普通 Java bin / out
Maven 项目 target/classes

六、VSCode 能不能控制 Maven 用 JDK?

✅ 可以,但本质不是 VSCode 控制

而是:

方式一:VSCode 自定义环境变量

"maven.terminal.customEnv": [
  {
    "environmentVariable": "JAVA_HOME",
    "value": "C:\\Program Files\\Java\\jdk1.8"
  }
]

👉 本质是:

VSCode 帮你执行:
set JAVA_HOME=JDK8
mvn package


七、Debug vs Maven 构建(核心区别)

操作 是否用 Maven 输出目录 JDK 来源
Debug target/classes VSCode
mvn compile target/classes JAVA_HOME / Toolchains
mvn package target/classes JAVA_HOME / Toolchains

八、最容易踩的坑

❌ 误区1

设置 target=1.8 就是用 JDK8

错!

👉 实际:

  • 只是生成 1.8 字节码

  • 编译器仍可能是 JDK17


❌ 误区2

VSCode 设置 JDK8 → Maven 就用 JDK8

错!

👉 Maven 只认:

  • JAVA_HOME

  • Toolchains


❌ 误区3

Debug = Maven 构建

错!

👉 Debug 是快速编译运行


九、最佳实践(推荐)

🎯 你的场景(强烈推荐)

  • 系统:JDK17

  • Maven 打包:JDK8


✅ 推荐方案

✔ 开发阶段

  • 用 VSCode Debug(快)

✔ 构建验证

mvn clean package

✔ 最优解

使用 Toolchains:

  • Maven 用 JDK8

  • 系统保持 JDK17


十、一句话总结

VSCode Debug 用的是 javac(插件),Maven 打包用的是 Maven,两套体系,JDK 也可以不同

更多推荐