2日前にリリースされたJava 11のいくつかの新機能をチェックしたかった。 JEP 3 は、Java-Source-Code-Programをコンパイル。Shebang-Filesの使用もサポートする必要があります。
したがって、私はこの小さなHello-WorldプログラムTest.Java
を書きました:
#!/opt/Java/jdk-11/bin/Java --source 11
public class Test
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
I ダウンロードしたJDK 11 で、それを/opt/Java
に抽出しました。したがって、シバン自体が機能しています。つまり/opt/Java/jdk-11/bin/Java --version
を実行すると
openjdk 11 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
Test.Java
を実行可能にした後(chmod +x Test.Java
を使用)、実行は失敗します。つまり./Test.Java
は私にくれます:
./Test.Java:1: error: illegal character: '#'
#!/opt/Java/jdk-11/bin/Java --source 11
^
./Test.Java:1: error: class, interface, or enum expected
#!/opt/Java/jdk-11/bin/Java --source 11
^
2 errors
error: compilation failed
Shebang-LineをTest.Java
から削除して/opt/Java/jdk-11/bin/Java --source 11 Test.Java
で開始するとすぐに、すべてがチャームのように機能し、期待どおりの出力が得られます:Hello World!
私のマシンはUbuntu 17.04
を実行しています。 javac
をJDK 11からのリンクにリンクしました(つまり、javac -version
を実行するとjavac 11
が得られます)。
Java
実行可能ファイルがシバン行を無視するためには、ファイル名の末尾が.Java
であってはなりません。別の拡張機能を使用することも、まったく拡張機能を使用しないこともできます(これは、JEPの例で何をするかであり、私が推奨する方法です)。
From JEP 3 (強調を追加):
ランチャーがソースファイルを読み取るとき、ファイルがJavaソースファイルでない場合(つまり、名前が.Javaで終わるファイルではない場合)そして、最初の行が#!で始まる場合、コンパイラに渡されるソースコードを決定するとき、最初の改行までの行の内容は無視されます。最初の行の後に表示されるファイルは、Java言語仕様のエディションで、7.3で定義されている有効なCompilationUnitで構成されている必要があります。オプション(存在する場合)、または--sourceオプションが存在しない場合にプログラムの実行に使用されているプラットフォームのバージョン。
特に「.sh」で終わる必要はありません。また、ファイルは実際にはシェルスクリプトではないため、誤解を招く可能性があります。
少し試行錯誤するだけで正しい解決策が得られました。これらの問題の原因は、ファイル拡張子.Java
でした。
つまりファイルの名前をTest.sh
に変更すると、すべてが機能します。
完全なHello-World-Shebang-Exampleは次のとおりです。
次のような内容のファイルTest.sh
を作成します
#!/opt/Java/jdk-11/bin/Java --source 11
public class Test
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
実行可能にします(つまり、chmod +x Test.sh
)。
最後に、./Test.sh
を使用して実行してください
リンクしたJEPによると( Shebangファイルのセクション を参照)、ShebangファイルはJavaプロセスを起動するために使用され、使用されません) Javaのパラメーターとして:
ソースファイルモードを使用してJavaランチャーを呼び出すShebangファイルは、次のようなもので始まる必要があります。
#!/path/to/Java --source version
たとえば、「Hello World」プログラムのソースコードを取得し、#!/ path/to/Java --source 10、次に、ファイルを実行可能としてマークします。次に、ファイルが現在のディレクトリにある場合、次のコマンドで実行できます。
$ ./hello
つまり、やりたいことはむしろTest.Java
実行可能ファイル。また、*。Javaという名前の場合、シバンとして機能せず、最初の行を削除するため、名前を変更する必要があります。
$ move Test.Java test
$ chmod +x test
$ ./test
これはShebangプロセッサを起動し、最初の行を削除して残りのスクリプトを/ path/to/Javaに渡し、Javaはスクリプトをコンパイルしてメインメソッドを実行します。