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もインストールされる)
- 設定画面(Ctrl+,)を開き、java.homeを自分の環境に合わせて設定しておく。
プログラムの実行
Hello, World!
まずは、Hello, World!を書いてみる。
- ファイル-フォルダを開く
- 新規ファイルを選択
- 右下の言語モードの選択でJavaを選択。文字コード・改行コードはお好みに
- main, sysoutなどのtemplateが用意されているようだ。
- 名前を付けて保存(Ctrl+Shift+S)する。Classpath is incomplete. Only syntax errors will be reported の警告は取り敢えず無視。
- デバッグの開始(F5) でプログラムを実行できるが、初回はlaunch.jsonファイルが作成されるのでもう一度F5で実行する。
- 以下のようにデバッグビューが開き、コンソールに実行結果が表示される。
日本語の表示(文字化けへの対応)
当然の事ながら、日本語も問題なく表示される…と言いたいところだが、そんなに甘くは無かった。デフォルトのままだと以下のようにコンソール表示が文字化けする。
これに対応するには、設定画面を開き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" のように追加すれば文字化けは解消できた。
Hot Code Replacementの実験
設定の変更
Hot Code Replacementはデフォルトでoffになっているので、設定画面で**"java.debug.settings.enableHotCodeReplace": true**の設定を加えておく。
プログラムの修正
Hot Code Replacementを試すためにプログラムを以下のように修正。
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()*メソッドの処理が置き換えられていることが確認できる。
まとめ
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にも対応しているとのことなので機会があれば試してみよう。