Visual Studio CodeのJava Extensionsでmodule対応の確認
はじめに
Visual Studio Codeは、クロスプラットフォームな開発環境で、数多くのプログラミング言語やファイル形式に対応した高機能エディタ+軽量IDE(統合開発環境)です。
特定のプログラミング言語/環境だけを扱うのであれば、その言語/環境に特化した高機能なIDEを使うと作業効率が高いでしょう(例:Windows OS上で、C#だけ扱う場合は、Visual Studioを使う)。
しかし、普段いろいろなプログラミング言語およびファイル形式(CSS、HTML、XML、Markdown、reStructuredText)を扱うときは、幅の広いVisual Studio Codeが便利です。
今回、Visual Studio CodeにJava Extensionsをインストールし、Javaプログラミングを行うときに、No build toolsプロジェクトでJava Platform Module System(JPMS)対応が可能かを確かめてみました。
Visual Studio CodeとJava Extensionsの準備
Visual Studio Codeに、Java Extensionsを追加する方法は次に書いています。
Javaプロジェクトの作成
Visual Studio CodeにJava Extensionsを追加すると、Javaのプロジェクトを作成し、ビルド・デバッグ・テスト・実行ができるようになります。
Java Extensionsで用意されるJavaのプロジェクトには、主に次の種類があります。
- サードパーティ製ビルドツールを使わない、No Build Toolsプロジェクト
- サードパーティ製ビルドツール Gradle を使うプロジェクト
- サードパーティ製ビルドツール Maven を使うプロジェクト
これ以外にも、特定のフレームワーク用のプロジェクト(Spring Boot、Quarkus、MicroProfile)もありますが、ここでは汎用のアプリケーションを作るプロジェクトを対象にします。
No Build Tools プロジェクトの作成
Visual Stuido Codeで、[View]メニュー > [Command Palette]をクリックし、[Java: Create Java Project...]を選択、[No build tools]を選択し、プロジェクトの基点となるディレクトリを置く親ディレクトリを指定します。次にプロジェクト名を入力、すると、プロジェクトの基点に指定したディレクトリの下に、プロジェクト名のディレクトリが生成され、中に雛形のディレクトリ・ファイルが生成されます。
C:\Users\torutk\Documents\work\ +-- HelloLogging +-- .vscode | +-- settings.json +-- bin +-- lib +-- src +-- App.java
このプログラムをビルドし実行してみます。[Run]メニューから[Run Without Debugging]を実行、またはApp.javaを開いたタブで右上の[▷]アイコンをクリックすると、プロジェクトが実行できます。
PS C:\Users\torutk\Documents\work\HelloLogging> c:; cd 'C:\Users\torutk\Documents\work\HelloLogging'; & 'C:\Program Files\Java\liberica-jdk-17.0.3-full\bin\java.exe' '-XX:+ShowCodeDetailsInExceptionMessages' '-cp' C:\Users\torutk\Documents\work\HelloLogging\bin' 'App' Hello, World! PS C:\Users\torutk\Documents\work\HelloLogging>
No build toolsプロジェクトでJava Platform Module Systemを扱う
Java SE 9で追加されたJava Platform Module System(JPMS)をVisual Studio CodeのJava Extensionsで扱えるかどうか確認してみます。
Googleで検索したところでは、No build toolsプロジェクトで、JPMSを扱えるという記述はみつかりませんでした。
では試してみましょう。
パッケージのフォルダを生成し、App.javaをパッケージフォルダに移動
Visual Studio Codeの左ペインでsrcディレクトリを右クリック、[New Folder]を選択、 @com\torutk\hello@と入力します。生成したフォルダに、App.javaをドラッグ&ドロップします。
Moveを選択すると、ファイル移動に伴いJavaコードのリファクタリングを行うか聞いてくるので、[OK]をクリックします。
すると、App.java に移動先フォルダ階層に適合するpackage文が生成されます。
package com.torutk.hello; public class App { public static void main(String[] args) throws Exception { System.out.println("Hello, World!"); } }
実行
プロジェクトを実行すると、srcフォルダのソースコードがコンパイルされbinフォルダの下に展開されます。次に、これをクラスパスに指定し、プログラムが実行されます。
PS C:\Users\torutk\Documents\work\HelloLogging> c:; cd 'C:\Users\torutk\Documents\work\HelloLogging'; & 'C:\Program Files\Java\liberica-jdk-17.0.3-full\bin\java.exe' '-XX:+ShowCodeDetailsInExceptionMessages' '-cp' C:\Users\torutk\Documents\work\HelloLogging\bin' 'com.torutk.hello.App' Hello, World! PS C:\Users\torutk\Documents\work\HelloLogging>
System.outをLoggingに書き換え
JPMSを確認するため、System.outをLoggingに書き換え、JPMSでjava.loggingを指定する設定をおこないます。まずは、System.out を Logger.getGlobal に書き換えます。
package com.torutk.hello; import java.util.logging.Logger; public class App { public static void main(String[] args) throws Exception { Logger.getGlobal().info("Hello, World!"); } }
ここで、まだJPMSの設定を追加する前に実行してみます。
PS C:\Users\torutk\Documents\work\HelloLogging> c:; cd 'C:\Users\torutk\Documents\work\HelloLogging'; & 'C:\Program Files\Java\liberica-jdk-17.0.3-full\bin\java.exe' '-XX:+ShowCodeDetailsInExceptionMessages' '-cp' C:\Users\torutk\Documents\work\HelloLogging\bin' 'com.torutk.hello.App' 7月 17, 2022 11:19:11 午後 com.torutk.hello.App main 情報: Hello, World! PS C:\Users\torutk\Documents\work\HelloLogging>
module-info.javaを追加
srcフォルダの直下に、module-info.javaを作成します。
module com.torutk.hello { requires java.logging; }
C:\Users\torutk\Documents\work\ +-- HelloLogging +-- .vscode | +-- settings.json +-- bin +-- lib +-- src +-- module-info.java +-- com +-- torutk +-- hello +-- App.java
実行
PS C:\Users\torutk\Documents\work\HelloLogging> c:; cd 'c:\Users\torutk\Documents\work\HelloLogging'; & 'C:\Program Files\Java\liberica-jdk-17.0.3-full\bin\java.exe' '-XX:+ShowCodeDetailsInExceptionMessages' '--module-path' 'C:\Users\torutk\Documents\work\HelloLogging\bin' '-m' 'com.torutk.hello/com.torutk.hello.App' 7月 17, 2022 11:26:54 午後 com.torutk.hello.App main 情報: Hello, World! PS C:\Users\torutk\Documents\work\HelloLogging>
ソースパスに、module-info.javaを追加すると、JPMS対応と認識し、実行時のオプションが変化します。
- --module-path JPMS対応のモジュールが格納されている場所を指定
- -m 実行するJPMS対応のモジュールを指定
まとめ
Visual Studio CodeのJava Extensionsで、No build toolsプロジェクトを生成し、module-info.javaをsrcフォルダ直下に配置したところ、module-info.javaの制約のチェック(requiresしないモジュールのクラスを参照するとエラーとなる)、実行時のモジュールパス、実行するモジュールとクラスの指定が行われます。