Java
文字化け
VSCode
VisualStudioCode

Visual Studio Code を使った Javaプログラム事始め

publickeyさんの記事「無償のコードエディタVSCode、実行中のJavaアプリのコードを動的に書き換えて修正できる「Hot Code Replacement」(ホットコード置換)を実現」に触発されてVSCodeを使ってみた。

環境

  • Windows 10
  • JDK 1.8.0_151

前準備

インストール

https://code.visualstudio.com から Stable Build をダウンロード/インストールする。現時点はバージョン1.19。

Java開発環境の設定

  • 拡張機能(Ctrl+Shift+X)ビューを開く
  • Java Extension Packをインストール(Debugger for Java, Laguage Support for Javaもインストールされる) screen0.png
  • 設定画面(Ctrl+,)を開き、java.homeを自分の環境に合わせて設定しておく。

プログラムの実行

Hello, World!

まずは、Hello, World!を書いてみる。
- ファイル-フォルダを開く
- 新規ファイルを選択
- 右下の言語モードの選択でJavaを選択。文字コード・改行コードはお好みに
screen1.png
- main, sysoutなどのtemplateが用意されているようだ。
screen2.png
- 名前を付けて保存(Ctrl+Shift+S)する。Classpath is incomplete. Only syntax errors will be reported の警告は取り敢えず無視。
- デバッグの開始(F5) でプログラムを実行できるが、初回はlaunch.jsonファイルが作成されるのでもう一度F5で実行する。
- 以下のようにデバッグビューが開き、コンソールに実行結果が表示される。
screen3.png

日本語の表示(文字化けへの対応)

当然の事ながら、日本語も問題なく表示される…と言いたいところだが、そんなに甘くは無かった。デフォルトのままだと以下のようにコンソール表示が文字化けする。

screen4.png

これに対応するには、設定画面を開きjava.jdt.ls.vmargs-Dfile.encoding=utf8を追加する。JVMの引数なので順番や文字コードをUTF-8にしても大丈夫と思ったのだが、もとの値の最後に-Dfile.encoding=UTF-8のように追加してもダメだった。"java.jdt.ls.vmargs": "-noverify -Dfile.encoding=utf8 -Xmx1G -XX:+UseG1GC -XX:+UseStringDeduplication" のように追加すれば文字化けは解消できた。
screen5.png

Hot Code Replacementの実験

設定の変更

Hot Code Replacementはデフォルトでoffになっているので、設定画面で"java.debug.settings.enableHotCodeReplace": trueの設定を加えておく。

プログラムの修正

Hot Code Replacementを試すためにプログラムを以下のように修正。

Test.java
public class Test {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++)
            sayHello();
    }

    private static void sayHello() {
        System.out.println("こんにちは世界!");
    }
}

プログラムの実行

sayHello()メソッドを呼び出す所にブレークポイントを設定しておき、デバッグを開始する。
- ブレークポイントで停止
- sayHello()メソッドの書き換え。保存
- 続行(F5)
を繰り返すと、プログラムの再起動無しにsayHello()メソッドの処理が置き換えられていることが確認できる。
screen6.png

まとめ

VSCodeを使って、JavaプログラムのHot Code Replacementを確認することができた。
最終的に、VSCodeでJavaを開発するために加えた設定は以下のようになる。

{
    "java.home": "JDKのパスを設定",
    "java.jdt.ls.vmargs": "-noverify  -Dfile.encoding=utf8 -Xmx1G -XX:+UseG1GC -XX:+UseStringDeduplication",
    "java.debug.settings.enableHotCodeReplace": true,
}

コンソールが文字化けには、デフォルトで対応していて欲しいものだがちょっとした設定を加える事で対応できたので良しとしよう。

機能的には普段使っているEclipseと比較すると物足りないが、何よりこの動作の軽さは魅力的である。Spring Bootにも対応しているとのことなので機会があれば試してみよう。