Java11ではjavacせずにJavaファイルが実行できるようになる

JDK11 ea18から、javacしないでもJavaファイルを実行できるようになりました。
あと、Windowsバイナリはzipファイルで提供されるようになっています。tarコマンドが提供されたとはいえ、エクスプローラーから解凍できるzipファイルになるのは ありがたい。
JDK 11 Early-Access Builds


JEP330が取り込まれたことにより、ソースファイルがひとつのJavaプログラムは、javac不要でjavaコマンドで実行できるようになります。
JEP 330: Launch Single-File Source-Code Programs


Windowsのコマンドプロンプトだと こんな感じ。

C:\Users\naoki\java>more Hello.java
public class Main {
  public static void main(String... args) {
    System.out.println("Hello!!");
  }
}

C:\Users\naoki\java>jdk-11-ea18\bin\java Hello.java
Hello!!


これはインタプリタのように逐次ソースコードを読みながら実行するというわけではなく、内部的には、次のようにメモリに出力してコンパイルが行われ、そのメモリ内容を実行するような処理になっています。

javac -d <memory> Hello.java
java -cp <memory> Main


ここで注目してもらいたいのは、ファイル名とクラス名が一致していないところです。


ただし、すでにクラスパス上にコンパイル済みclassファイルがある場合はエラーになります。

C:\Users\naoki\java>jdk-11-ea18\bin\java Hello.java
error: class found on application class path: Main


拡張子javaを付けない場合でも、--source指定をすれば直接実行ができます。

C:\Users\naoki\java>more hello
public class Main {
  public static void main(String... args) {
    System.out.println("Hello!!");
  }
}

C:\Users\naoki\java>jdk-11-ea18\bin\java --source 11 hello
Hello!!


これを利用すると、ShebangとしてJavaファイルをコマンドのように実行することもできます。Cygwinですが、次のようになりました。

naoki@DESKTOP-P96N9VS ~$ cat hello
#! /cygdrive/c/Users/naoki/java/jdk-11-ea18/bin/java --source 11
public class Main {
  public static void main(String... args) {
    System.out.println("Hello!!");
  }
}

naoki@DESKTOP-P96N9VS ~$ ls hello -l
-rwxr-xr-x 1 naoki naoki 171 6月  17 17:50 hello

naoki@DESKTOP-P96N9VS ~$ ./hello
Hello!!


Javaを少し気軽に実行できるようになりますね。入門には とてもいいと思います。