またまたRemote - Containersの話です。今回はJava。
[Remote - Containersを使う動機]
VS CodeでJavaプロジェクトを開いたところ、このようなメッセージが表示された。
JDK11がインストールされていないと、VS Code上での構文チェックなどJavaサポートが受けられなくなる、ということらしい。メッセージ内のリンク先を見ると、2020年9月に予定されているEclipseの変更が影響しているようだ。
2020年9月までに手元のマシンを更新することはできるが、Java 8を利用したりする関係上、今すぐにJava 11へは切り替えたくない。
ということで、最近当ブログでおなじみのVS CodeのRemote - Containers拡張機能を利用して、Java 11を動かしてみることにした。
[Java 11コンテナのセットアップ]
今回VS Codeは1.47.0を利用している。
まず、新しく空のディレクトリを作成してVS Codeで開く。左下に「><」のようなボタンがあるのでクリックする。
するとRemote - Containersのメニューが開くので、「Reopen in Container」を選択する。
すると、デフォルトで利用できる様々なコンテナ定義が表示される。
Java 11を利用したいので「java」と入力する。すると、おなじみのJava 8に加えて、LTSのJava 11、2020年7月現在最新のJava 14などのコンテナが選択できる。ここは大人しくJava 11を選択しておく。
※ときどき検索結果が正しくなく、下のような画面が表示されることがある。その場合は「Show All Definitions...」をクリックして再度検索文字列を入力すればよい。
無事コンテナの準備が終わると、「.devcontainer」フォルダ以下に設定ファイルが追加される。ウィンドウの表示もプロジェクト名の末尾に[Dev Container: Java 11]と表示されているのが確認できる。
試しにVS CodeのターミナルからJavaのバージョンを確認してみると以下の通りだった。
root@43adc6ea0200:/workspaces/java-sandbox/java11-shebang# java -version openjdk version "11.0.8" 2020-07-14 OpenJDK Runtime Environment 18.9 (build 11.0.8+10) OpenJDK 64-Bit Server VM 18.9 (build 11.0.8+10, mixed mode)
ここまでで基本的なセットアップは終わりだが、以下の記事を参考にコンテナ内のタイムゾーンを設定しておくとgitのログを見る際など何かと便利である。
[単一ファイルの実行]
せっかくなので、Java 11から利用できるようになった新機能である、Javaプログラムの単一ファイル実行を試してみる。
package com.kdnakt; public class App { public static void main(String... args) { System.out.println("Hello Java11!"); } }
VS Codeのターミナルから、java
コマンドで上記ファイルを実行すると以下のようになった。
root@43adc6ea0200:/workspaces/java-sandbox/java11-shebang# java App.java Hello Java11!
わざわざjavacコマンドでコンパイルしてから実行する必要もなければ、パッケージ名と同じディレクトリに配置する必要もないので、シンプルなJavaのコードであれば、楽に試せるようになったと思う。
[shebangとしてのJava実行]
最近のJavaについて勉強していたところ、『みんなのJava』で、上記機能を利用して、Javaのソースコードをコマンドとして実行する方法が紹介されていたので、こちらも試してみることに。
app
というファイルを以下のような内容で作成する。
#! /usr/local/openjdk-11/bin/java --source 11 package com.kdnakt; public class App { public static void main(String... args) { System.out.println("Hello shebang!"); } }
chmod +x app
コマンドを実行して実行権限を付与したのちに、以下のように実行できる。
root@43adc6ea0200:/workspaces/java-sandbox/java11-shebang# ./app Hello shebang!
他のライブラリが使えないので、本格的なコマンドラインツールにするの厳しそうだが、コードを残しておけるのでjshellで書き捨てながらJavaの動作確認をするよりは生産的になれる、気がした。
[まとめ]
- Remote - Containersはやっぱり手元のマシンを汚さず環境を構築できて便利
- Java 11の単一Javaファイルの直接実行を試した
- また、同様のコードをshebangとしてコマンド実行した
- 今回利用したコードは以下のリポジトリにまとめてある
java-sandbox/java11-shebang at master · kdnakt/java-sandbox · GitHub