きしだのはてな このページをアンテナに追加 RSSフィード

2018-06-17(日) Java11ではjavacせずにJavaファイルが実行できるようになる

[]Java11ではjavacせずにJavaファイルが実行できるようになる 21:43 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を少し気軽に実行できるようになりますね。入門には とてもいいと思います。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。