运行和调试Java
Visual Studio Code 通过 Java 调试器 扩展允许您调试 Java 应用程序。它是一个基于 Java 调试服务器 的轻量级 Java 调试器,扩展了 Red Hat 的 Java™ 语言支持。
以下是支持的调试功能列表:
- 发射/附加
- 断点
- 例外情况
- 暂停 & 继续
- 进入/退出/覆盖
- 变量
- 调用堆栈
- 线程
- 调试控制台
- 评估
- 热代码替换
Java调试器是一个开源项目,欢迎贡献者通过GitHub仓库进行合作:
如果您在使用以下功能时遇到任何问题,可以通过输入 问题 来联系我们。
安装
要获得 Visual Studio Code 中的完整 Java 语言支持,您可以安装 Java 扩展包,该扩展包包括 Java 调试器扩展。
有关如何开始使用扩展包的详细信息,您可以查看Java 入门 教程。
配置
默认情况下,调试器将自动运行,找到主类并在内存中生成默认的启动配置来启动您的应用程序。
如果您希望自定义并持久化您的启动配置,您可以选择创建一个 launch.json 文件链接在运行和调试视图中。

该launch.json文件位于一个.vscode在你的工作区(项目根文件夹)中创建一个文件夹。
有关如何创建的更多详细信息launch.json,阅读启动配置;有关Java配置选项的更多详细信息,您可以阅读配置选项。
运行和调试
调试器扩展提供了多种方式来运行和调试您的 Java 应用程序。
从代码Windows运行
您将在运行|调试的代码分析中找到主函数()功能。

从编辑器菜单运行
另一种开始调试的方法是选择运行Java或调试Java菜单,从顶部编辑器标题栏。

按F5键运行
按F5,调试器将自动找到您的项目入口并开始调试。您还可以从VS Code侧边栏的运行和调试视图启动调试会话。请参阅VS Code中的调试。
调试单个文件
除了对由构建工具管理的Java项目的调试支持外,VS Code 还支持对没有项目的单个Java文件进行调试。
调试会话输入
VS Code 的默认调试控制台不支持输入。如果您的程序需要从终端获取输入,您可以使用 VS Code 内置终端 (⌃` (Windows, Linux Ctrl+`)) 或外部终端来启动它。您也可以使用用户设置 java调试设置控制台配置一个全局控制台用于所有Java调试会话。
断点
Java 调试器支持各种断点,例如行断点、条件断点、数据断点和日志点。
断点 - 条件断点
通过表达式评估的帮助,调试器还支持条件断点。您可以设置断点,以便在表达式评估为真时中断。
断点 - 数据断点
你可以在变量更改其值时让调试器暂停。请注意,数据断点只能在调试会话中设置。这意味着你需要启动你的应用程序,并首先在常规断点上暂停。然后你可以在变量视图中选择一个字段并设置数据断点。

断点 - 日志点
日志点 也受Java调试器支持。日志点允许您将输出发送到调试控制台,而无需编辑代码。它们与断点不同,因为它们不会停止您应用程序的执行流程。
断点 - 触发断点
触发断点是在另一个断点被触发后自动启用的断点。当诊断仅在满足某些先决条件后才会发生的代码中的故障情况时,它们非常有用。
通过右键单击字形边缘,选择添加触发断点,然后选择哪个其他断点启用该断点。
表达式评估
调试器还允许您在观察Windows以及调试控制台中评估表达式。
热代码替换
调试器支持的另一个高级功能是“热代码”替换。Hot Code Replace (HCR) 是一种调试技术,通过调试通道将Java类更改传输到另一个Java虚拟机(JVM)的调试器。HCR 促进了实验性开发,并推动了迭代的试错编码。有了这个新功能,你可以在开发环境中更改Java文件,然后启动调试会话,调试器将替换正在运行的JVM中的代码。不需要重启,这就是为什么它被称为“热”的原因。以下是使用VS Code中的Java调试器和HCR的示例。
您可以使用调试设置java调试设置热代码替换控制如何触发热代码替换。可能的设置值是:
手册- 点击工具栏以应用更改(默认)。自动- 自动应用编译后的更改。从不- 禁用热代码替换。
步进滤波
步过滤支持扩展,以过滤出你在调试时不想看到或单步执行的类型。有了这个功能,你可以配置包以在你的 launch.json这样在单步执行时可以跳过它们。
配置选项
有许多选项和设置可以配置调试器。例如,使用启动选项可以轻松配置JVM参数和环境变量。
查阅文档Red Hat 的 Java™ 语言支持 扩展以获取有关设置项目的帮助。
对于许多常用设置,VS Code Java 调试器配置中都有示例。该文档解释了Java调试器如何为您自动生成配置,如果您需要修改这些配置,如何通过主类、不同参数、环境、附加到其他Java进程以及使用更高级的功能来实现。
以下是所有可用的配置发射和附件有关如何撰写的更多信息,请访问launch.json 文件,参见 调试.
发射
主类(必填)- 完全限定的类名(例如 [java 模块名称/]com.xyz.MainApp)或程序入口的 Java 文件路径。参数- 传递给程序的命令行参数。使用"${command:指定程序参数}"用于提示程序参数。它接受一个字符串或字符串数组。源路径- 程序的额外源目录。调试器默认情况下会从项目设置中查找源代码。此选项允许调试器在额外的目录中查找源代码。模块路径- 启动JVM的模块路径。如果未指定,调试器将自动从当前项目中解析。$自动- 自动解析当前项目的模块路径。$运行时- 当前项目中'runtime'作用域内的模块路径。$测试- 当前项目中'test'作用域内的模块路径。!/路径/到/排除- 从模块路径中排除指定的路径。/路径/追加- 将指定路径附加到模块路径。
类路径- 启动JVM的类路径。如果未指定,调试器将自动从当前项目中解析。$自动- 自动解析当前项目的类路径。$运行时- 当前项目中'release'范围内的类路径。$测试- 当前项目中'test'作用域内的类路径。!/路径/到/排除- 从类路径中排除指定的路径。/路径/追加- 将指定路径附加到类路径。
编码-文件编码JVM 的设置。如果未指定,将使用 'UTF-8'。可能的值可以在 支持的编码 中找到。虚拟机参数- JVM 的额外选项和系统属性(例如 -Xms项目名称- 调试器搜索类的首选项目。不同项目中可能会有重复的类名。此设置在启动程序时调试器查找指定的主类时也适用。当工作区有多个Java项目时需要此设置,否则表达式评估和条件断点可能无法正常工作。当前工作目录- 程序的工作目录。默认为${工作区文件夹}输入:.环境- 程序的额外环境变量。环境文件- 包含环境变量定义的文件的绝对路径。停止进入- 启动后自动暂停程序。控制台- 指定要启动程序的控制台。如果未指定,则使用指定的控制台。java调试设置控制台用户设置。内部控制台- VS Code 调试控制台(不支持输入流)。集成终端- VS Code 集成终端。外部终端- 用户设置中可以配置的外部终端。
缩短命令行- 当项目有很长的类路径或大的VM参数时,启动程序的命令行可能会超过操作系统允许的最大命令行字符串限制。此配置项提供了多种缩短命令行的方法。默认为自动。无- 用标准命令行 'java {选项} 类名 {参数}' 启动程序。jarmanifest- 生成临时类路径参数到类路径.jar文件,并使用命令行'java -cp classpath.jar classname {args}'启动程序。参数文件- 生成类路径参数到一个临时参数文件,并使用命令行 'java @argfile {args}' 启动程序。此值仅适用于 Java 9 及更高版本。自动- 自动检测命令行长度,并通过适当的方法缩短命令行。
步长滤波器- 跳过指定的类或方法在单步执行时。类名过滤器- [已弃用 - 被跳过课程] 在单步执行时跳过指定的类。类名应为完全限定名。支持通配符。跳过课程- 在单步执行时跳过指定的类。您可以使用内置变量,如‘$JDK’和‘$Libraries’来跳过一组类,或者添加特定的类名表达式,例如Java.*,*.Foo输入:.跳过合成物- 在单步执行时跳过合成方法。跳过静态初始化器- 调试时跳过静态初始化方法。跳过构造函数- 调试单步执行时跳过构造函数方法。
附件
主机名(必填)- 远程调试目标的主机名或IP地址。端口(必填)- 远程调试目标的调试端口。进程ID- 使用进程选择器选择要附加的进程,或使用整数形式的进程ID。${命令:选择Java进程}- 使用进程选择器选择一个进程附加。- 整数 PID - 附加到指定的本地进程。
超时- 重新连接前的超时值,以毫秒为单位(默认为30000毫秒)。源路径- 程序的额外源目录。调试器默认情况下会从项目设置中查找源代码。此选项允许调试器在额外的目录中查找源代码。项目名称- 调试器搜索类的首选项目。在不同的项目中可能会有重复的类名。当工作区有多个Java项目时,这是必需的,否则表达式评估和条件断点可能无法正常工作。步长滤波器- 跳过指定的类或方法在单步执行时。类名过滤器- [已弃用 - 被跳过课程] 在单步执行时跳过指定的类。类名应为完全限定名。支持通配符。跳过课程- 在单步执行时跳过指定的类。您可以使用内置变量,如‘$JDK’和‘$Libraries’来跳过一组类,或者添加特定的类名表达式,例如Java.*,*.Foo输入:.跳过合成物- 在单步执行时跳过合成方法。跳过静态初始化器- 调试时跳过静态初始化方法。跳过构造函数- 调试单步执行时跳过构造函数方法。
用户设置
java调试日志级别: 发送到 VS Code 的调试器日志的最低级别,默认为警告输入:.java调试设置显示十六进制:在变量中以十六进制格式显示数字,默认为假的输入:.java调试设置显示静态变量:在变量中显示静态变量,默认为假的输入:.java.debug.settings.显示限定名:在变量中显示完全限定的类名,默认为假的输入:.java.debug.settings.显示逻辑结构:显示集合和映射类的逻辑结构在变量中,默认为真输入:.java调试设置显示ToString:显示所有重写 toString 方法的类的 toString 值 变量,默认为真输入:.java调试设置的最大字符串长度:在 变量 或 调试控制台 中显示的字符串的最大长度。超过此限制的字符串将被截断。默认值是0,这意味着不进行任何修剪。java调试设置热代码替换在调试过程中重新加载更改的Java类,默认为手册确保java.自动构建.启用在 Java 语言支持扩展 中未被禁用。请参阅 Hot Code Replace 维基页面 以获取有关用法和限制的更多信息。- 手册 - 点击工具栏以应用更改。
- 自动 - 自动应用编译后的更改。
- 从不 - 从不应用这些更改。
java.debug.settings.enableHotCodeReplace:启用Java代码的热代码替换。确保VS Code Java的自动构建没有被禁用。 热代码替换维基页面查看更多关于使用和限制的信息。java调试设置启用运行调试代码感知启用主入口点的运行和调试按钮的 CodeLens 提供程序,默认为真输入:.java.debug.settings.forceBuildBeforeLaunch在启动Java程序之前构建工作区,默认为真输入:.java调试设置控制台指定要启动Java程序的控制台,默认为集成终端如果你希望为特定的调试会话定制控制台,请修改控制台配置在launch.json。内部控制台- VS Code 调试控制台(不支持输入流)。集成终端- VS Code 集成终端。外部终端- 用户设置中可以配置的外部终端。
java.debug.settings.exceptionBreakpoint.skipClasses: 在异常发生时跳过指定的类。您可以使用内置变量,如‘$JDK’和‘$Libraries’来跳过一组类,或者添加特定的类名表达式,例如Java.*,*.Foo输入:.java.debug.settings.stepping.skipClasses跳过指定的类。您可以使用内置变量,如‘$JDK’和‘$Libraries’来跳过一组类,或者添加特定的类名表达式,例如Java.*,*.Foo输入:.java调试设置. 步骤跳过合成代码跳过合成方法。java调试设置. 步骤跳过静态初始化器跳过静态初始化器方法进行单步执行。java.debug.settings.stepping.skipConstructors跳过构造函数方法进行单步执行。java.debug.settings.jdwp limitOfVariablesPerJdwpRequest: 一次 JDWP 请求中可以请求的最大变量或字段数量。该值越高,在展开变量视图时调试目标请求的频率就越低。但是,大量请求可能导致 JDWP 请求超时。默认值为 100。java.debug.settings.jdwp.requestTimeout: JDWP请求在调试器与目标JVM通信时的超时时间(毫秒)。默认为3000。java.debug.settings.vmArgs默认的VM参数用于启动Java程序。例如,使用' -Xmx1G -ea '将堆大小增加到1 GB并启用断言。如果您想为特定的调试会话定制VM参数,可以修改'vmArgs'配置launch.json输入:.java.静默通知: 控制是否可以使用通知来报告进度。如果为真,则改用状态栏来报告进度。默认为假的输入:.
故障排除
如果您在使用调试器时遇到问题,可以在vscode-java-debug GitHub 仓库找到详细的故障排除指南。
常见问题解释包括:
- Java 语言支持扩展无法启动。
- 构建失败,您是否想继续?
- *.java 不在类路径上。只会报告语法错误。
- 程序错误:无法找到或加载主类X。
- 程序抛出ClassNotFoundException。
- 热代码替换未完成。
- 请在 launch.json 中指定远程调试目标的主机名和端口。
- 评估失败。原因:无法评估,因为线程已恢复。
- 无法找到包含主方法的类。
- 在启动调试器时,没有为vscode.java.startDebugSession分配委托命令处理程序。
- 无法解析类路径。
- 请求类型 "X" 不支持。仅支持 "launch" 和 "attach"。
反馈和问题
您可以在 vscode-java-debug 仓库中找到完整的 Issues 列表。您可以提交 错误或功能建议 并参与 vscode-java-debug Gitter 频道 的社区讨论。
下一步
继续阅读,了解:
- 调试 - 了解如何在 VS Code 中使用调试器来调试你的项目,适用于任何语言。
对于Java: