如何在 Java 11(或更高版本)中启动单文件程序?

Mic*_*ter 6 java java-11

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

$ ./Example.java

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

Mic*_*ter 6

简洁版本:

$ java Example.java data.txt
Run Code Online (Sandbox Code Playgroud)

或(与#!):

$ ./example data.txt
Run Code Online (Sandbox Code Playgroud)

细节:

工作示例在这里

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

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]
    }
}
Run Code Online (Sandbox Code Playgroud)

用法一:

假设代码位于Example.javajava位于 上PATH,则用法为:

java Example.java data.txt

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

用法2:

假设代码位于文件 中,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
Run Code Online (Sandbox Code Playgroud)

用法是:

./example data.txt


Nam*_*man 5

尽管您的答案包含正确的信息。简而言之,java从 JDK11 开始就可以简单地执行文件,例如在 MacOS 上

.../jdk-11.jdk/Contents/Home/bin/java Sample.java
Run Code Online (Sandbox Code Playgroud)

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

.../jdk-11.jdk/Contents/Home/bin/java <file-name>.java arg1 arg2
Run Code Online (Sandbox Code Playgroud)

将在执行阶段arg1提供字符串参数。arg2

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