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