如何用 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

参考资料

java