如何用 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
。
參考文獻