首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 11:通过Shebang执行源文件不起作用

Java 11:通过Shebang执行源文件不起作用
EN

Stack Overflow用户
提问于 2018-09-27 06:09:10
回答 3查看 6K关注 0票数 23

我想看看java 11的一些新特性,它是两天前发布的。JEP 330说我可以在不编译的情况下启动Java Program.它还应该支持使用Shebang-Files。

因此,我编写了这个小小的Hello程序Test.java

代码语言:javascript
复制
#!/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给了我

代码语言:javascript
复制
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给了我:

代码语言:javascript
复制
./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)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-27 19:05:51

文件名不能以.java结尾,以便java可执行文件忽略shebang行。您可以使用不同的扩展,或者根本没有扩展(这是JEP示例中它们所做的,也是我推荐的)。

来自JEP 330 (重点是后加的):

当启动程序读取源文件时,如果该文件不是源文件(即它不是以.java结尾的文件),如果第一行以#!开头,则在确定要传递给编译器的源代码时忽略该行的内容,但不包括第一行换行符。第一行后出现的文件的内容必须由JavaLanguageSpecification第7.3节定义的有效CompilationUnit组成,该版本适用于--源选项中给出的平台版本(如果存在),或者如果--源选项不存在,则该平台用于运行程序的平台版本。

它不需要特别以".sh“结尾;而且,这可能会产生误导,因为该文件实际上不是一个shell脚本。

票数 32
EN

Stack Overflow用户

发布于 2018-09-27 06:16:24

一点点的尝试和错误给了我正确的解决方案。导致这些问题的是文件扩展名.java

也就是说,如果我将文件重命名为Test.sh,那么一切都正常。

下面是一个完整的Hello-World-Shebang-示例:

创建一个文件Test.sh,其内容如下

代码语言:javascript
复制
#!/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执行它

票数 7
EN

Stack Overflow用户

发布于 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和剥离第一行工作。

代码语言:javascript
复制
$ move Test.java test
$ chmod +x test
$ ./test 

这将启动shebang处理器,该处理器将删除第一行,并将脚本的其余部分传递给/path/ to /java,Java将编译脚本并运行main方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52530470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档