Java生態已經有兩個強大的專案管理工具,Maven和Gradle,但缺少一個簡單而強大的腳本工具。
這就是 JBang 發揮作用的地方。
它是一個簡約但功能強大的 Java、Kotlin 和 Groovy 檔案啟動器。
事實上,它允許您像運行腳本一樣輕鬆地運行程式碼。
它還提供許多其他功能,例如依賴管理、模板和 App Store。
讓我們在這篇文章中探索 JBang 及其功能。
設定
jbang 命令列可以使用不同的方法安裝在 Windows、Linux 和 macOS 上,這些方法在此處有詳細記錄。
我們可以透過執行 jbang --version 來驗證安裝。
除此之外,最好為我們最喜歡的 IDE 安裝隨附的 IDE 擴充功能。
此處列出了支援的 IDE 擴充。
JBang 不依賴 JDK 到 JRE,但執行使用 Java 的腳本需要 JDK。
您可以透過執行 jbang jdk install 23 來安裝 JBang,這將安裝 JDK 23。
我們現在準備好要寫我們的第一個腳本。
第一個腳本
讓我們建立一個簡單的腳本來列印「Hello, World!」到控制台。
> jbang init helloworld.java
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
這將建立一個名為 helloworld.java 的文件,可以使用 jbang helloworld.java 運行。
> jbang helloworld.java
Hello world
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
當您開啟該文件時,您將看到它是一個普通的 Java 文件,帶有 main 方法和特定的第一行。
///usr/bin/env jbang "<pre class="brush:php;toolbar:false">> chmod +x helloworld.java
> ./helloworld.java
Hello world
登入後複製
登入後複製
登入後複製
登入後複製
" "$@" ; exit $?
import static java.lang.System.*;
public class helloworld {
public static void main(String... args) {
out.println("Hello world");
}
}
正如我們將看到的,JBang 腳本由三個部分組成:shebang、可選屬性和腳本本身。
我們將在接下來的部分中使用第二部分的一些屬性,但讓我們專注於第一部分。
這部分 ///usr/bin/env jbang "$0" "$@" ;退出$?告訴系統使用 JBang 來執行腳本。
它在 Unix 生態系統中被稱為 shebang,用於指定腳本的解釋器。
我們可以在 Unix 系統(macOS、Linux)上透過執行 chmod x helloworld.java 使腳本可執行,然後執行 ./helloworld.java 來說明這一點。
/// usr/bin/env jbang "<pre class="brush:php;toolbar:false">///usr/bin/env jbang "<pre class="brush:php;toolbar:false">//JAVA 23+
//COMPILE_OPTIONS --enable-preview -source 23
//RUNTIME_OPTIONS --enable-preview
登入後複製
登入後複製
登入後複製
" "$@" ; exit $?
//JAVA 23+
//COMPILE_OPTIONS --enable-preview -source 23
//RUNTIME_OPTIONS --enable-preview
void main(String... args) {
System.out.println("Hello World");
}
" "$@" ; exit $?
//JAVA 25
//COMPILE_OPTIONS --enable-preview -source 25
//RUNTIME_OPTIONS --enable-preview
import java.util.concurrent.Callable;
import java.util.concurrent.StructuredTaskScope;
import static java.lang.System.*;
void main(String... args) {
out.println("Hello Java 25");
Callable
task1 = () -> {
out.println("Task 1" + Thread.currentThread());
return "Task 1";
};
Callable task2 = () -> {
out.println("Task 2" + Thread.currentThread());
return 2;
};
try (
var scope = new StructuredTaskScope