如何用 Java 编写单文件源代码可执行文件
从 JDK 11 开始,Java 支持直接执行源文件,而无需先编译为类文件,这使得用 Java 编写脚本成为可能,就像通常使用动态编程语言(如 python、ruby 或 nodejs)一样。这篇文章既是示例,也是实现它的快速参考。
步骤可以简单概括如下
-
确保 shebang 设置如下:
#!/usr/bin/env java --source 17
,注意--source
很重要 -
确保源代码文件中第一个顶级类包含
psvm
方法作为执行入口 -
确保文件名不包含
.java
扩展名,并且可以使用chmod +x ./filename
执行文件
例子
- 将以下内容保存为名为
fib
的文件并使其可执行
#!/usr/bin/env java --source 17
public class Fib {
public static void main(String[] args) {
long num = Long.parseLong(args[0]);
System.out.println(fib(num));
}
private static long fib(long n) {
if (n < 2) return n;
return fib(n - 2) + fib(n - 1);
}
}
- 从命令行尝试
~$ ./fib 10
55
注释
-
也可以在不设置 shebang 行
#!/usr/bin/env java --source 17
的情况下以java filename.java
的方式运行,在这种情况下文件不需要设置为可执行文件,文件名不需要与源代码文件中的第一个顶级类名匹配(如常规 java 代码),但需要.java
文件扩展名。 -
如果单文件可执行文件使用 JDK 之外的外部依赖,则可以使用通常的
-cp
参数传递,例如:java -cp /path/to/3rd-party.jar filename.java
。
参考资料