我想看看java 11的一些新特性,它是两天前发布的。JEP 330说我可以在不编译的情况下启动Java Program.它还应该支持使用Shebang-Files。
因此,我编写了这个小小的Hello程序Test.java
#!/opt/java/jdk-11/bin/java --source 11
public class Test
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}我下载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一旦我从Test.java中删除了Shebang-Line,并开始使用/opt/java/jdk-11/bin/java --source 11 Test.java,一切就像一种魅力一样工作,我得到了预期的输出:Hello World!。
我的机器正在运行Ubuntu 17.04。我已经将javac链接到JDK 11中的一个(即执行javac -version给出javac 11)。
发布于 2018-09-27 19:05:51
文件名不能以.java结尾,以便java可执行文件忽略shebang行。您可以使用不同的扩展,或者根本没有扩展(这是JEP示例中它们所做的,也是我推荐的)。
来自JEP 330 (重点是后加的):
当启动程序读取源文件时,如果该文件不是源文件(即它不是以.java结尾的文件),如果第一行以#!开头,则在确定要传递给编译器的源代码时忽略该行的内容,但不包括第一行换行符。第一行后出现的文件的内容必须由JavaLanguageSpecification第7.3节定义的有效CompilationUnit组成,该版本适用于--源选项中给出的平台版本(如果存在),或者如果--源选项不存在,则该平台用于运行程序的平台版本。
它不需要特别以".sh“结尾;而且,这可能会产生误导,因为该文件实际上不是一个shell脚本。
发布于 2018-09-27 06:16:24
一点点的尝试和错误给了我正确的解决方案。导致这些问题的是文件扩展名.java。
也就是说,如果我将文件重命名为Test.sh,那么一切都正常。
下面是一个完整的Hello-World-Shebang-示例:
创建一个文件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执行它
发布于 2018-09-27 06:22:58
根据您链接到的JEP (请参阅雪邦档案部分),shebang文件将用于启动java进程,而不是用作java的参数:
使用源文件模式调用Java启动程序的shebang文件必须以如下方式开头:
#!/path/to/java --source version例如,我们可以将"Hello“程序的源代码放在一个名为hello的文件中,在#!/path/to/java - source 10,的第一行之后,然后将该文件标记为可执行的。然后,如果该文件位于当前目录中,则可以使用以下方法执行:$ ./hello
换句话说,您想要做的是使Test.java可执行。您还必须重命名它,因为当它命名为*.java时,它将不能作为shebang和剥离第一行工作。
$ move Test.java test
$ chmod +x test
$ ./test 这将启动shebang处理器,该处理器将删除第一行,并将脚本的其余部分传递给/path/ to /java,Java将编译脚本并运行main方法。
https://stackoverflow.com/questions/52530470
复制相似问题