🚀 VS Code で を入手しましょう!

Java の実行とデバッグ

Visual Studio Code では、Debugger for Java 拡張機能を使用して Java アプリケーションをデバッグできます。これは、Java Debug Server に基づく軽量な Java デバッガーであり、Language Support for Java™ by Red Hat を拡張したものです。

サポートされているデバッグ機能のリストを以下に示します。

  • 起動/アタッチ
  • ブレークポイント
  • 例外
  • 一時停止と続行
  • ステップイン/アウト/オーバー
  • 変数
  • コールスタック
  • スレッド
  • デバッグコンソール
  • 評価
  • ホットコードリプレース

Java デバッガーはオープンソースプロジェクトであり、GitHub リポジトリを通じて共同作業を行うコントリビューターを歓迎します。

以下の機能を使用する際に問題が発生した場合は、issue を入力してご連絡ください。

インストール

Visual Studio Code で完全な Java 言語サポートを利用するには、Debugger for Java 拡張機能を含む Extension Pack for Java をインストールできます。

Extension Pack for Java をインストールする

拡張機能パックの開始方法の詳細については、Java 入門 チュートリアルをご覧ください。

構成

デフォルトでは、デバッガーはメインクラスを自動的に検索し、アプリケーションを起動するためのデフォルトの起動構成をメモリ内に生成することで、すぐに実行できます。

起動構成をカスタマイズして永続化する場合は、[**実行とデバッグ**] ビューの [**launch.json ファイルを作成する**] リンクを選択できます。

Debug Menu

launch.json ファイルは、ワークスペース (プロジェクトルートフォルダー) の .vscode フォルダーにあります。

launch.json の作成方法の詳細については、起動構成 をお読みください。Java の構成オプションの詳細については、構成オプション をお読みください。

実行とデバッグ

デバッガー拡張機能は、Java アプリケーションを実行およびデバッグするための複数の方法を提供します。

CodeLens から実行

main() 関数の CodeLens に [**実行|デバッグ**] が表示されます。

CodeLens

エディターメニューから実行

デバッグを開始するもう 1 つの方法は、上部のエディタータイトルバーから [**Java を実行**] または [**Java をデバッグ**] メニューを選択することです。

EditorMenu

F5 キーを押して実行

F5 キーを押すと、デバッガーはプロジェクトのエントリポイントを自動的に検索してデバッグを開始します。VS Code のサイドバーの [**実行とデバッグ**] ビューからデバッグセッションを開始することもできます。詳細については、VS Code でのデバッグ を参照してください。

単一ファイルのデバッグ

ビルドツールで管理された Java プロジェクトのデバッグのサポートに加えて、VS Code はプロジェクトなしで単一の Java ファイルのデバッグもサポートしています。

デバッグセッションの入力

VS Code のデフォルトのデバッグコンソールは入力をサポートしていません。プログラムがターミナルからの入力を必要とする場合は、VS Code 内の統合ターミナル (⌃` (Windows、Linux Ctrl+`)) または外部ターミナルを使用して起動できます。ユーザー設定 java.debug.settings.console を使用して、すべての Java デバッグセッションのグローバルコンソールを構成することもできます。

ブレークポイント

Debugger for Java は、行ブレークポイント、条件付きブレークポイント、データブレークポイント、ログポイントなど、さまざまなブレークポイントをサポートしています。

ブレークポイント - 条件付きブレークポイント

式評価の助けを借りて、デバッガーは条件付きブレークポイントもサポートしています。式が true と評価されたときにブレークするようにブレークポイントを設定できます。

ブレークポイント - データブレークポイント

変数の値が変更されたときにデバッガーをブレークさせることができます。データブレークポイントは、デバッグセッション内でのみ設定できることに注意してください。つまり、アプリケーションを起動し、最初に通常のブレークポイントでブレークする必要があります。その後、[**変数**] ビューでフィールドを選択し、データブレークポイントを設定できます。

Data Breakpoint

ブレークポイント - ログポイント

ログポイント は、Java デバッガーでもサポートされています。ログポイントを使用すると、コードを編集せずにデバッグコンソールに出力を送信できます。アプリケーションの実行フローを停止しないため、ブレークポイントとは異なります。

ブレークポイント - トリガーされたブレークポイント

トリガーされたブレークポイントは、別のブレークポイントがヒットすると自動的に有効になるブレークポイントです。特定の前提条件の後にのみ発生するコードの障害ケースを診断する場合に非常に役立ちます。

トリガーされたブレークポイントは、グリフマージンを右クリックし、[**トリガーされたブレークポイントを追加**] を選択し、ブレークポイントを有効にする他のブレークポイントを選択することで設定できます。

式の評価

デバッガーを使用すると、[**ウォッチ**] ウィンドウとデバッグコンソールで式を評価することもできます。

ホットコードリプレース

デバッガーがサポートするもう 1 つの高度な機能は、「ホットコード」置換です。ホットコードリプレース (HCR) は、Debugger for Java がデバッグチャネルを介してクラスの変更を別の Java Virtual Machine (JVM) に送信するデバッグ手法です。HCR は、実験的な開発を促進し、反復的な試行錯誤のコーディングを促進します。この新機能を使用すると、デバッグセッションを開始し、開発環境で Java ファイルを変更すると、デバッガーは実行中の JVM でコードを置き換えます。再起動は不要なため、「ホット」と呼ばれます。以下は、VS Code の Debugger for Java で HCR を使用する方法の図です。

デバッグ設定 java.debug.settings.hotCodeReplace を使用して、ホットコードリプレースをトリガーする方法を制御できます。可能な設定値は次のとおりです。

  • manual - ツールバーをクリックして変更を適用します (デフォルト)。
  • auto - コンパイル後に変更を自動的に適用します。
  • never - ホットコードリプレースを無効にします。

ステップフィルター

ステップフィルターは、デバッグ中に表示またはステップスルーしたくない型をフィルターで除外するために、拡張機能でサポートされています。この機能を使用すると、launch.json 内でフィルター処理するパッケージを構成して、ステップスルーするときにスキップできます。

構成オプション

デバッガーを構成するために使用できるオプションと設定は多数あります。たとえば、JVM 引数と環境変数の構成は、起動オプションで簡単に行うことができます。

プロジェクトの設定に関するヘルプについては、Language Support for Java™ by Red Hat 拡張機能のドキュメントを参照してください。

一般的に使用される多くのセットアップについては、VS Code Java Debugger Configuration でサンプルを入手できます。このドキュメントでは、Java デバッガーが構成を自動的に生成する方法と、それらを変更する必要がある場合に、メインクラス、さまざまな引数、環境、他の Java プロセスへのアタッチ、およびより高度な機能の使用方法について説明します。

以下は、起動 および アタッチ で使用できるすべての構成です。launch.json ファイルの記述方法の詳細については、デバッグ を参照してください。

起動

  • mainClass (必須) - プログラムエントリの完全修飾クラス名 ([Java モジュール名/]com.xyz.MainApp など) または Java ファイルパス。
  • args - プログラムに渡されるコマンドライン引数。プログラム引数の入力を求めるには、"${command:SpecifyProgramArgs}" を使用します。文字列または文字列の配列を受け入れます。
  • sourcePaths - プログラムの追加ソースディレクトリ。デバッガーは、デフォルトでプロジェクト設定からソースコードを探します。このオプションを使用すると、デバッガーは追加のディレクトリでソースコードを探すことができます。
  • modulePaths - JVM を起動するためのモジュールパス。指定しない場合、デバッガーは現在のプロジェクトから自動的に解決します。
    • $Auto - 現在のプロジェクトのモジュールパスを自動的に解決します。
    • $Runtime - 現在のプロジェクトの「runtime」スコープ内のモジュールパス。
    • $Test - 現在のプロジェクトの「test」スコープ内のモジュールパス。
    • !/path/to/exclude - 指定されたパスをモジュールパスから除外します。
    • /path/to/append - 指定されたパスをモジュールパスに追加します。
  • classPaths - JVM を起動するためのクラスパス。指定しない場合、デバッガーは現在のプロジェクトから自動的に解決します。
    • $Auto - 現在のプロジェクトのクラスパスを自動的に解決します。
    • $Runtime - 現在のプロジェクトの「runtime」スコープ内のクラスパス。
    • $Test - 現在のプロジェクトの「test」スコープ内のクラスパス。
    • !/path/to/exclude - 指定されたパスをクラスパスから除外します。
    • /path/to/append - 指定されたパスをクラスパスに追加します。
  • encoding - JVM の file.encoding 設定。指定しない場合は、「UTF-8」が使用されます。可能な値は、サポートされているエンコーディング にあります。
  • vmArgs - JVM の追加オプションとシステムプロパティ (-Xms<size> -Xmx<size> -D<name>=<value> など)。文字列または文字列の配列を受け入れます。
  • projectName - デバッガーがクラスを検索する優先プロジェクト。異なるプロジェクトで重複するクラス名が存在する可能性があります。この設定は、プログラムの起動時にデバッガーが指定されたメインクラスを探す場合にも機能します。ワークスペースに複数の Java プロジェクトがある場合は必須です。そうしない場合、式評価と条件付きブレークポイントが機能しない可能性があります。
  • cwd - プログラムの作業ディレクトリ。デフォルトは ${workspaceFolder} です。
  • env - プログラムの追加環境変数。
  • envFile - 環境変数定義を含むファイルへの絶対パス。
  • stopOnEntry - 起動後にプログラムを自動的に一時停止します。
  • console - プログラムを起動する指定されたコンソール。指定しない場合は、java.debug.settings.console ユーザー設定で指定されたコンソールを使用します。
    • internalConsole - VS Code デバッグコンソール (入力ストリームはサポートされていません)。
    • integratedTerminal - VS Code 統合ターミナル。
    • externalTerminal - ユーザー設定で構成できる外部ターミナル。
  • shortenCommandLine - プロジェクトに長いクラスパスまたは大きな VM 引数がある場合、プログラムを起動するためのコマンドラインが、OS で許可されるコマンドライン文字列の最大長を超える可能性があります。この構成項目は、コマンドラインを短縮するための複数のアプローチを提供します。デフォルトは auto です。
    • none - 標準コマンドライン 'java {options} classname {args}' でプログラムを起動します。
    • jarmanifest - クラスパスパラメーターを一時的な classpath.jar ファイルに生成し、コマンドライン 'java -cp classpath.jar classname {args}' でプログラムを起動します。
    • argfile - クラスパスパラメーターを一時的な引数ファイルに生成し、コマンドライン 'java @argfile {args}' でプログラムを起動します。この値は、Java 9 以降にのみ適用されます。
    • auto - コマンドラインの長さを自動的に検出し、適切なアプローチでコマンドラインを短縮するかどうかを決定します。
  • stepFilters - ステップ実行時に指定されたクラスまたはメソッドをスキップします。
    • classNameFilters - [**非推奨** - skipClasses に置き換えられました] ステップ実行時に指定されたクラスをスキップします。クラス名は完全修飾である必要があります。ワイルドカードがサポートされています。
    • skipClasses - ステップ実行時に指定されたクラスをスキップします。'$JDK' や '$Libraries' などの組み込み変数を使用してクラスのグループをスキップしたり、java.**.Foo などの特定のクラス名式を追加したりできます。
    • skipSynthetics - ステップ実行時に合成メソッドをスキップします。
    • skipStaticInitializers - ステップ実行時に静的イニシャライザーメソッドをスキップします。
    • skipConstructors - ステップ実行時にコンストラクターメソッドをスキップします。

アタッチ

  • hostName (必須) - リモートデバッギーのホスト名または IP アドレス。
  • port (必須) - リモートデバッギーのデバッグポート。
  • processId - プロセスピッカーを使用してアタッチするプロセスを選択するか、プロセス ID を整数として指定します。
    • ${command:PickJavaProcess} - プロセスピッカーを使用してアタッチするプロセスを選択します。
    • 整数 PID - 指定されたローカルプロセスにアタッチします。
  • timeout - 再接続するまでのタイムアウト値 (ミリ秒単位) (デフォルトは 30000 ミリ秒)。
  • sourcePaths - プログラムの追加ソースディレクトリ。デバッガーは、デフォルトでプロジェクト設定からソースコードを探します。このオプションを使用すると、デバッガーは追加のディレクトリでソースコードを探すことができます。
  • projectName - デバッガーがクラスを検索する優先プロジェクト。異なるプロジェクトで重複するクラス名が存在する可能性があります。ワークスペースに複数の Java プロジェクトがある場合は必須です。そうしない場合、式評価と条件付きブレークポイントが機能しない可能性があります。
  • stepFilters - ステップ実行時に指定されたクラスまたはメソッドをスキップします。
    • classNameFilters - [**非推奨** - skipClasses に置き換えられました] ステップ実行時に指定されたクラスをスキップします。クラス名は完全修飾である必要があります。ワイルドカードがサポートされています。
    • skipClasses - ステップ実行時に指定されたクラスをスキップします。'$JDK' や '$Libraries' などの組み込み変数を使用してクラスのグループをスキップしたり、java.**.Foo などの特定のクラス名式を追加したりできます。
    • skipSynthetics - ステップ実行時に合成メソッドをスキップします。
    • skipStaticInitializers - ステップ実行時に静的イニシャライザーメソッドをスキップします。
    • skipConstructors - ステップ実行時にコンストラクターメソッドをスキップします。

ユーザー設定

  • java.debug.logLevel: VS Code に送信されるデバッガーログの最小レベル。デフォルトは warn です。
  • java.debug.settings.showHex: [**変数**] で数値を 16 進数形式で表示します。デフォルトは false です。
  • java.debug.settings.showStaticVariables: [**変数**] で静的変数を表示します。デフォルトは false です。
  • java.debug.settings.showQualifiedNames: [**変数**] で完全修飾クラス名を表示します。デフォルトは false です。
  • java.debug.settings.showLogicalStructure: [**変数**] で Collection および Map クラスの論理構造を表示します。デフォルトは true です。
  • java.debug.settings.showToString: [**変数**] で「toString」メソッドをオーバーライドするすべてのクラスの 'toString()' 値を表示します。デフォルトは true です。
  • java.debug.settings.maxStringLength: [**変数**] または [**デバッグコンソール**] に表示される文字列の最大長。この制限を超える文字列は切り捨てられます。デフォルトは 0 で、切り捨ては実行されません。
  • java.debug.settings.hotCodeReplace: デバッグ中に変更された Java クラスをリロードします。デフォルトは manual です。Java Language Support extensionjava.autobuild.enabled が無効になっていないことを確認してください。使用方法と制限事項の詳細については、ホットコードリプレース wiki ページ を参照してください。
    • manual - ツールバーをクリックして変更を適用します。
    • auto - コンパイル後に変更を自動的に適用します。
    • never - 変更を適用しません。
  • java.debug.settings.enableHotCodeReplace: Java コードのホットコードリプレースを有効にします。VS Code Java で自動ビルドが無効になっていないことを確認してください。使用方法と制限事項の詳細については、ホットコードリプレース wiki ページ を参照してください。
  • java.debug.settings.enableRunDebugCodeLens: メインエントリポイントの実行ボタンとデバッグボタンの CodeLens プロバイダーを有効にします。デフォルトは true です。
  • java.debug.settings.forceBuildBeforeLaunch: Java プログラムを起動する前にワークスペースを強制的にビルドします。デフォルトは true です。
  • java.debug.settings.console: Java プログラムを起動する指定されたコンソール。デフォルトは integratedTerminal です。特定のデバッグセッションのコンソールをカスタマイズする場合は、launch.jsonconsole 構成を変更してください。
    • internalConsole - VS Code デバッグコンソール (入力ストリームはサポートされていません)。
    • integratedTerminal - VS Code 統合ターミナル。
    • externalTerminal - ユーザー設定で構成できる外部ターミナル。
  • java.debug.settings.exceptionBreakpoint.skipClasses: 例外でブレークするときに指定されたクラスをスキップします。'$JDK' や '$Libraries' などの組み込み変数を使用してクラスのグループをスキップしたり、java.**.Foo などの特定のクラス名式を追加したりできます。
  • java.debug.settings.stepping.skipClasses: ステップ実行時に指定されたクラスをスキップします。'$JDK' や '$Libraries' などの組み込み変数を使用してクラスのグループをスキップしたり、java.**.Foo などの特定のクラス名式を追加したりできます。
  • java.debug.settings.stepping.skipSynthetics: ステップ実行時に合成メソッドをスキップします。
  • java.debug.settings.stepping.skipStaticInitializers: ステップ実行時に静的イニシャライザーメソッドをスキップします。
  • java.debug.settings.stepping.skipConstructors: ステップ実行時にコンストラクターメソッドをスキップします。
  • java.debug.settings.jdwp.limitOfVariablesPerJdwpRequest: 1 つの JDWP リクエストでリクエストできる変数またはフィールドの最大数。値が高いほど、変数ビューを展開するときにデバッギーがリクエストされる頻度が少なくなります。また、数値が大きいと JDWP リクエストがタイムアウトする可能性があります。デフォルトは 100 です。
  • java.debug.settings.jdwp.requestTimeout: デバッガーがターゲット JVM と通信するときの JDWP リクエストのタイムアウト (ミリ秒単位)。デフォルトは 3000 です。
  • java.debug.settings.vmArgs: Java プログラムを起動するためのデフォルトの VM 引数。たとえば、ヒープサイズを 1 GB に増やしてアサーションを有効にするには、「-Xmx1G -ea」を使用します。特定のデバッグセッションの VM 引数をカスタマイズする場合は、launch.json の「vmArgs」構成を変更できます。
  • java.silentNotification: 通知を使用して進行状況を報告するかどうかを制御します。true の場合、代わりにステータスバーを使用して進行状況を報告します。デフォルトは false です。

トラブルシューティング

デバッガーの使用中に問題が発生した場合は、詳細なトラブルシューティングガイドが vscode-java-debug GitHub リポジトリ にあります。

説明されている一般的な問題は次のとおりです。

  • Java Language Support 拡張機能が起動に失敗する。
  • ビルドに失敗しましたが、続行しますか?
  • *.java がクラスパスにありません。構文エラーのみが報告されます。
  • プログラムエラー: メインクラス X を見つけられなかったか、ロードできませんでした。
  • プログラムが ClassNotFoundException をスローします。
  • ホットコードリプレースを完了できませんでした。
  • launch.json でリモートデバッギーのホスト名とポートを指定してください。
  • 評価に失敗しました。理由: スレッドが再開されているため、評価できません。
  • メインメソッドを持つクラスが見つかりません。
  • デバッガーの起動時に vscode.java.startDebugSession の delegateCommandHandler がありません。
  • クラスパスを解決できませんでした。
  • リクエストタイプ "X" はサポートされていません。"launch" と "attach" のみがサポートされています。

フィードバックと質問

問題の完全なリストは、vscode-java-debug リポジトリで確認できます。バグまたは機能の提案 を送信したり、コミュニティ主導の vscode-java-debug Gitter チャネル に参加したりできます。

次のステップ

詳細については、以下をお読みください。

  • デバッグ - あらゆる言語のプロジェクトで VS Code でデバッガーを使用する方法をご覧ください。

Java の場合

  • Java テスト - Java Test Runner 拡張機能を使用して VS Code 内で Java をテストします。
  • Java 拡張機能 - VS Code 用のより便利な Java 拡張機能について学びます。