Java 11単一ファイルのソースコード
1. 前書き
JDK 11は、2018年9月にリリースされたJava SE11の実装です。
このチュートリアルでは、単一ファイルのソースコードプログラムを起動するJava11の新機能について説明します。
2. Java 11より前
単一ファイルプログラムは、プログラムが単一のソースファイルに収まるプログラムです。
Java 11より前は、単一ファイルのプログラムであっても、プログラムを実行するには2段階のプロセスに従う必要がありました。
たとえば、HelloWorld.javaというファイルにmain()メソッドを持つHelloWorldというクラスが含まれている場合、we would have to first compile it:
$ javac HelloWorld.java
これにより、we would have to run using the command:というクラスファイルが生成されます。
$ java HelloWorld
Hello Java 11!
このようなプログラムは、Javaの学習の初期段階または小さなユーティリティプログラムを作成するときに標準です。 このコンテキストでは、プログラムを実行する前にプログラムをコンパイルする必要があるのは少し儀式的です。
But, wouldn’t it be great to just have a one-step process instead? Java 11は、このようなプログラムをソースから直接実行できるようにすることで、これに対処しようとします。
3. 単一ファイルのソースコードプログラムの起動
Java 11以降では、次のコマンドを使用して単一ファイルプログラムを実行できます。
$ java HelloWorld.java
Hello Java 11!
JavaクラスではなくJavaソースコードファイル名をjavaコマンドに渡した方法に注目してください。
JVMは、ソースファイルをメモリにコンパイルしてから、最初に検出したパブリックmain()メソッドを実行します。
ソースファイルにエラーが含まれている場合はコンパイルエラーが発生しますが、それ以外の場合は、すでにコンパイルした場合と同じように実行されます。
4. コマンドラインオプション
Javaランチャーは、この機能をサポートするために新しいsource-file modeを導入しました。 次の2つの条件のいずれかに該当する場合、ソースファイルモードが有効になります。
-
コマンドラインの最初の項目の後にJVMオプションが続くのは、拡張子が.javaのファイル名です。
-
コマンドラインには、–sourceバージョンオプションが含まれています
If the file does not follow the standard naming conventions for Java source files, we need to use the –source option.このようなファイルについては、次のセクションで詳しく説明します。
元のコマンドラインのソースファイルのAny arguments placed after the nameは、実行時にコンパイル済みクラスに渡されます。
たとえば、Additionクラスを含むAddition.javaというファイルがあります。 このクラスには、引数の合計を計算するmain()メソッドが含まれています。
$ java Addition.java 1 2 3
また、ファイル名の前に–class-pathなどのオプションを渡すこともできます。
$ java --class-path=/some-path Addition.java 1 2 3
さて、we’ll get an error if there is a class on the application classpath with the same name as the class we are executing。
たとえば、開発中のある時点で、現在の作業ディレクトリにあるファイルをjavacを使用してコンパイルしたとします。
$ javac HelloWorld.java
これで、現在の作業ディレクトリに両方のHelloWorld.java and HelloWorld.classが存在します。
$ ls
HelloWorld.class HelloWorld.java
ただし、ソースファイルモードを使用しようとすると、エラーが発生します。
$ java HelloWorld.java
error: class found on application class path: HelloWorld
5. シバンファイル
macOSやLinuxなどのUnix派生システムでは、「#!」を使用するのが一般的です。実行可能スクリプトファイルを実行するためのディレクティブ。
たとえば、シェルスクリプトは通常、次で始まります。
#!/bin/sh
その後、スクリプトを実行できます。
$ ./some_script
このようなファイルは「シェバンファイル」と呼ばれます。
この同じメカニズムを使用して、Java単一ファイルプログラムを実行できるようになりました。
ファイルの先頭に次を追加すると:
#!/path/to/java --source version
たとえば、addという名前のファイルに次のコードを追加しましょう。
#!/usr/local/bin/java --source 11
import java.util.Arrays;
public class Addition
{
public static void main(String[] args) {
Integer sum = Arrays.stream(args)
.mapToInt(Integer::parseInt)
.sum();
System.out.println(sum);
}
}
そして、ファイルを実行可能としてマークします。
$ chmod +x add
その後、スクリプトのようにファイルを実行できます。
$ ./add 1 2 3
6
ランチャーを明示的に使用して、shebangファイルを呼び出すこともできます。
$ java --source 11 add 1 2 3
6
The –source option is required even if it’s already present in the file.ファイル内のシバンは無視され、.java拡張子のない通常のJavaファイルとして扱われます。
ただし、, we can’t treat a .java file as a shebang file, even if it contains a valid shebang.したがって、次の結果はエラーになります。
$ ./Addition.java
./Addition.java:1: error: illegal character: '#'
#!/usr/local/bin/java --source 11
^
shebangファイルに関する最後の注意事項は、ディレクティブによってファイルがプラットフォームに依存することです。 The file will not be usable on platforms like Windows, which does not natively support it.
6. 結論
この記事では、Java 11で導入された新しい単一ファイルのソースコード機能について説明しました。
いつものように、コードスニペットはover on GitHubにあります。