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

时间:2018-08-20 17:16:50

标签: java java-11

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

$ ./Example.java

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

2 个答案:

答案 0 :(得分:4)

尽管answer by you包含正确的信息。只需将其简单化,就可以使用java从JDK11开始执行文件,例如在MacOS上

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

这将寻求并执行标准的 public static void main(String[] args) 方法。可以注意到(甚至是初学者)此方法接受类型为args的{​​{1}},因此传递了在原始命令行中位于源文件的名称之后的参数到编译后的类执行时。因此,以下命令

String

在执行阶段将提供字符串参数.../jdk-11.jdk/Contents/Home/bin/java <file-name>.java arg1 arg2 arg1

附带说明 -如果文件包含具有标准主要方法的多个类,则在源文件中找到的第一个顶级类应包含标准的声明执行公共静态void main(String [])方法。

答案 1 :(得分:3)

简短版:

$ java Example.java data.txt

或(使用#!):

$ ./example data.txt

详细信息:

工作示例here

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

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]
    }
}

用法1:

假设代码在Example.java中并且javaPATH上,则用法是:

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

用法是:

./example data.txt