kdnakt blog

hello there.

Java 11の単一ファイル実行をRemote - Containers上でshebangとして実行してみた

またまたRemote - Containersの話です。今回はJava

 

 

[Remote - Containersを使う動機]

VS CodeJavaプロジェクトを開いたところ、このようなメッセージが表示された。

f:id:kidani_a:20200720005633p:plain

 

JDK11がインストールされていないと、VS Code上での構文チェックなどJavaサポートが受けられなくなる、ということらしい。メッセージ内のリンク先を見ると、2020年9月に予定されているEclipseの変更が影響しているようだ。

github.com

www.eclipse.org

 

2020年9月までに手元のマシンを更新することはできるが、Java 8を利用したりする関係上、今すぐにJava 11へは切り替えたくない。

ということで、最近当ブログでおなじみのVS CodeのRemote - Containers拡張機能を利用して、Java 11を動かしてみることにした。

 

[Java 11コンテナのセットアップ]

今回VS Codeは1.47.0を利用している。

まず、新しく空のディレクトリを作成してVS Codeで開く。左下に「><」のようなボタンがあるのでクリックする。

f:id:kidani_a:20200721022352p:plain

 

するとRemote - Containersのメニューが開くので、「Reopen in Container」を選択する。

f:id:kidani_a:20200721022547p:plain

 

すると、デフォルトで利用できる様々なコンテナ定義が表示される。

f:id:kidani_a:20200721022952p:plain

 

Java 11を利用したいので「java」と入力する。すると、おなじみのJava 8に加えて、LTSのJava 11、2020年7月現在最新のJava 14などのコンテナが選択できる。ここは大人しくJava 11を選択しておく。

f:id:kidani_a:20200721023103p:plain

 

※ときどき検索結果が正しくなく、下のような画面が表示されることがある。その場合は「Show All Definitions...」をクリックして再度検索文字列を入力すればよい。

f:id:kidani_a:20200721022750p:plain

 

無事コンテナの準備が終わると、「.devcontainer」フォルダ以下に設定ファイルが追加される。ウィンドウの表示もプロジェクト名の末尾に[Dev Container: Java 11]と表示されているのが確認できる。

f:id:kidani_a:20200721023502p:plain

 

試しに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のログを見る際など何かと便利である。 

kdnakt.hatenablog.com

 

[単一ファイルの実行]

せっかくなので、Java 11から利用できるようになった新機能である、Javaプログラムの単一ファイル実行を試してみる。

 

App.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