Java 11: Executing Source File via Shebang is not working

mam10eks :

I wanted to check out some new features of java 11 which was released two days ago. JEP 330 states that I could launch a Java-Source-Code-Program without compiling. It should also support the usage of Shebang-Files.

Hence I have written this small Hello-World Program 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 downloaded JDK 11 and extracted it to /opt/java. Hence the Shebang itself is working. I.e. executing /opt/java/jdk-11/bin/java --version gives me

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)

After making Test.java executable (using chmod +x Test.java) the execution is failing. I.e. ./Test.java gives me:

./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

As soon as I remove the Shebang-Line from Test.java and start it with /opt/java/jdk-11/bin/java --source 11 Test.java everything is working like a charm and I get the expected output: Hello World!

My machine is running Ubuntu 17.04. I have linked javac to the one from JDK 11 (i.e. executing javac -version gives javac 11).

Miles :

The file name must not end with .java in order for the java executable to ignore the shebang line. You can use a different extension, or just have no extension at all (which is what they do in the JEP example and is what I would recommend).

From JEP 330 (emphasis added):

When the launcher reads the source file, if the file is not a Java source file (i.e. it is not a file whose name ends with .java) and if the first line begins with #!, then the contents of that line up to but not including the first newline are ignored when determining the source code to be passed to the compiler. The content of the file that appears after the first line must consist of a valid CompilationUnit as defined by §7.3 in the edition of the Java Language Specification that is appropriate to the version of the platform given in the --source option, if present, or the version of the platform being used to run the program if the --source option is not present.

It doesn't need to end with ".sh" specifically; also, that's potentially misleading because the file is not actually a shell script.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=35537&siteId=1