单文件源代码程序执行
在 JDK 11 中,Java 引入了使用java
启动器启动单文件源代码程序的功能,而无需首先显式编译源代码。这是通过java
启动器自动调用编译器并将编译后的代码存储在内存中来实现的。这是学习如何使用 Java 或探索 Java API 中的新功能的好方法,而无需经历编译和执行代码的繁琐工作。有几种方法可以使用此功能,以及一些限制和需要牢记的事项。
执行您的第一个单文件源代码程序
要执行单文件源代码程序,源文件中定义的第一个类必须包含public static void main(String[])
如下所示:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
从命令行,可以使用Java+源文件名启动:
$ java HelloWorld.java
传入参数
参数也可以像正常编译的类一样传递,因此在下面:
public class HelloJava {
public static void main(String[] args) {
System.out.println("Hello " + args[0]);
}
}
传入参数可以像这样完成:
$ java HelloJava.java World!
同一文件中的多个类
如果需要封装目的,可以在同一个源文件中定义多个类,如以下示例所示:
public class MultipleClassesInSameFile {
public static void main(String[] args) {
System.out.println(GenerateMessage.generateMessage());
System.out.println(AnotherMessage.generateAnotherMessage());
}
}
class GenerateMessage {
static String generateMessage() {
return "Here is one message";
}
}
class AnotherMessage {
static String generateAnotherMessage() {
return "Here is another message";
}
}
执行时:
$ java MultipleClassesInSameFile.java
将输出:
Here is one message
Here is another message
引用 JDK 类和非 JDK 类
作为核心 JDK 一部分的类不需要添加到要执行的类路径中。
import java.util.Scanner;
import java.util.regex.MatchResult;
public class ScannerExample {
public static void main(String... args) {
String wordsAndNumbers = """
Longing rusted furnace
daybreak 17 benign
9 homecoming 1
freight car
""";
try (Scanner scanner = new Scanner(wordsAndNumbers)) {
scanner.findAll("benign").map(MatchResult::group).forEach(System.out::println);
}
}
}
要启动:
$ java ScannerExample.java
但是,以下引用 Apache Commons Lang 的RandomUtils的示例需要在启动时将commons-lang.jar添加到类路径中:
import org.apache.commons.lang3.RandomUtils;
public class ReferenceNonJDKClass {
public static void main(String[] args) {
System.out.println(RandomUtils.nextInt());
}
}
要启动:
java -cp /path/to/commons-lang3-3.12.0.jar ReferenceNonJDKClass.java
作为 Shebang 文件执行
在类 Unix 操作系统上,单文件源代码应用程序也可以像脚本一样作为 shebang 文件启动。 在 java 源文件中,作为文件中的第一行添加 path/to/java/home --source <version>
,如下例所示:
#!/path/to/your/bin/java --source 16
public class HelloJava {
public static void main(String[] args) {
System.out.println("Hello " + args[0]);
}
}
该文件不能具有.java文件扩展名,并且还必须是chmod +x
可执行的。有了它,它可以通过以下方式启动:
./HelloJava