web-dev-qa-db-ja.com

Java 11:Shebangによるソースファイルの実行が機能しない

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が得られます)。

17
mam10eks

Java実行可能ファイルがシバン行を無視するためには、ファイル名の末尾が.Javaであってはなりません。別の拡張機能を使用することも、まったく拡張機能を使用しないこともできます(これは、JEPの例で何をするかであり、私が推奨する方法です)。

From JEP 3 (強調を追加):

ランチャーがソースファイルを読み取るとき、ファイルがJavaソースファイルでない場合(つまり、名前が.Javaで終わるファイルではない場合)そして、最初の行が#!で始まる場合、コンパイラに渡されるソースコードを決定するとき、最初の改行までの行の内容は無視されます。最初の行の後に表示されるファイルは、Java言語仕様のエディションで、7.3で定義されている有効なCompilationUnitで構成されている必要があります。オプション(存在する場合)、または--sourceオプションが存在しない場合にプログラムの実行に使用されているプラ​​ットフォームのバージョン。

特に「.sh」で終わる必要はありません。また、ファイルは実際にはシェルスクリプトではないため、誤解を招く可能性があります。

18
Miles

少し試行錯誤するだけで正しい解決策が得られました。これらの問題の原因は、ファイル拡張子.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を使用して実行してください

6
mam10eks

リンクしたJEPによると( Shebangファイルのセクション を参照)、ShebangファイルはJavaプロセスを起動するために使用され、使用されません) Javaのパラメーターとして:

ソースファイルモードを使用してJavaランチャーを呼び出すShebangファイルは、次のようなもので始まる必要があります。

#!/path/to/Java --source version

たとえば、「He​​llo World」プログラムのソースコードを取得し、#!/ path/to/Java --source 10、次に、ファイルを実行可能としてマークします。次に、ファイルが現在のディレクトリにある場合、次のコマンドで実行できます。

$ ./hello

つまり、やりたいことはむしろTest.Java実行可能ファイル。また、*。Javaという名前の場合、シバンとして機能せず、最初の行を削除するため、名前を変更する必要があります。

$ move Test.Java test
$ chmod +x test
$ ./test 

これはShebangプロセッサを起動し、最初の行を削除して残りのスクリプトを/ path/to/Javaに渡し、Javaはスクリプトをコンパイルしてメインメソッドを実行します。

1
ernest_k