4

JEP 330描述了 JDK 11 中用于在 Java 中启动单文件程序的新功能。我试过了:

$ ./Example.java

但它不起作用。正确的用法是什么?

4

2 回答 2

4

尽管您的答案包含正确的信息。只是想把它用更简单的术语来说,一个文件可以简单地使用java从 JDK11 开始执行,例如在 MacOS 上

.../jdk-11.jdk/Contents/Home/bin/java Sample.java

这将寻求并执行标准public static void main(String[] args)方法。可以注意到(即使是初学者)此方法接受argstype String,因此在原始命令行中源文件名称之后放置的参数在执行时传递给已编译的类。因此以下命令

.../jdk-11.jdk/Contents/Home/bin/java <file-name>.java arg1 arg2

将在执行阶段提供字符串 arguments arg1arg2

旁注- 如果文件包含多个具有标准 main 方法的类,则执行在源文件中找到的第一个顶级类,该类应包含标准public static void main(String[])方法的声明。

于 2018-08-20T18:01:00.437 回答
4

精简版:

$ java Example.java data.txt

或(带#!):

$ ./example data.txt

细节:

这里的工作示例。

考虑一个单文件程序来打印文件中的行:

import java.nio.file.*;
import java.util.stream.Stream;

public class ExampleJDK11 {
    public static void main(String[] args) throws Exception {
        // snip ... print file args[0]
    }
}

用法一:

假设代码在Example.java并且java在 上PATH,那么用法是:

java Example.java data.txt

  • 请注意,没有javac步骤(!)
  • 请注意,文件名不必与类名匹配。

用法二:

假设代码在一个文件中,example顶部有一个“shebang”行:

#!/Users/measter/tools/jdk-11.jdk/Contents/Home/bin/java --source 8 

import java.nio.file.*;
import java.util.stream.Stream;
// as above

用法是:

./example data.txt

于 2018-08-20T17:16:49.640 回答