subtask2 = scope.fork(task2);
scope.join();
} catch (Exception e) {
e.printStackTrace();
}
}
Kini kami boleh membangunkan skrip kami seperti yang kami lakukan dengan mana-mana fail Java.
Setelah ia sedia untuk diterbitkan, kami boleh mengeksportnya dalam format yang berbeza seperti berikut:
Fail jar : jbang eksport mudah alih helloworld.java. Jika skrip anda menggunakan kebergantungan, arahan seterusnya adalah lebih disyorkan.
Satu fatjar : yang mengandungi semua kebergantungan: jbang eksport fatjar helloworld.java. Kaedah ini masih memerlukan pemasangan JDK / JRE pada mesin sasaran. Jika anda tidak mahu melakukannya, arahan seterusnya adalah lebih disyorkan.
Perduaan jlink yang merangkumi JDK: jbang eksport jlink helloworld.java. Perduaan untuk dijalankan ialah sama ada helloworld-jlink/bin/helloworld pada Unix atau helloworld-jlink/bin/helloworld.bat pada Windows.
A imgae asli : jbang eksport asli helloworld.java. Ini memerlukan pemasangan GraalVM.
Skrip juga boleh dieksport sebagai mavenrepo dengan: jbang export mavenrepo helloworld.java
pengurusan JDK
Seperti yang dilihat dalam bab sebelumnya, JBang boleh memasang JDK pada mesin anda.
Anda boleh menyenaraikan JDK yang dipasang dengan senarai jbang jdk, senaraikan yang tersedia untuk dipasang dengan jbang jdk list --available --show-details, pasang yang baharu dengan jbang jdk install [versi]. Jbang juga menyokong penggunaan SDKMAN untuk mengurus JDK pada sistem yang disokong.
Selain itu, adalah mungkin untuk menentukan versi JDK dalam skrip.
Ini dilakukan dengan menambahkan baris berikut pada sifat skrip: //JAVA [versi] jika kita mahu versi yang tepat atau //JAVA [versi] jika kita mahu sekurang-kurangnya versi tertentu.
Dalam kes itu, JBang akan memasang versi JDK yang diperlukan secara automatik dan menggunakannya hanya untuk skrip tersebut tanpa mengubah JDK lalai sistem.
Sebagai contoh, skrip berikut menggunakan Java 25 dan beberapa ciri pratonton.
> jbang init helloworld.java
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Skrip tanpa kelas "Utama".
Memandangkan skrip cenderung ringan, adalah lebih baik untuk menulisnya tanpa kelas dan kaedah utama.
Nasib baik, Java mempunyai ciri yang dipanggil kelas yang diisytiharkan tersirat dan kaedah utama contoh (yang masih dalam pratonton dalam Java 23).
Ciri ini membolehkan untuk menulis atur cara java dan skrip JBang tanpa kelas dan kaedah utama statik.
Skrip berikut akan disusun dan dilaksanakan tanpa sebarang masalah.
> jbang helloworld.java
Hello world
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Ini dimungkinkan dengan menambahkan sifat berikut pada skrip.
///usr/bin/env jbang "<pre class="brush:php;toolbar:false">> chmod +x helloworld.java
> ./helloworld.java
Hello world
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
" "$@" ; exit $?
import static java.lang.System.*;
public class helloworld {
public static void main(String... args) {
out.println("Hello world");
}
}
Baris pertama, //JAVA 23 , memberitahu JBang untuk menggunakan Java 23 atau lebih baru.
Baris kedua dan ketiga, //COMPILE_OPTIONS --dayakan-pratonton -sumber 23 dan //RUNTIME_OPTIONS --dayakan-pratonton, masing-masing dayakan ciri pratonton untuk penyusunan dan masa jalan.
Setelah ciri menjadi stabil, kami boleh mengalih keluar 3 baris dan skrip masih akan berfungsi. Kemas!
Kebergantungan
JBang menyokong penambahan kebergantungan pada skrip dalam bentuk kebergantungan gaya Gradle dengan menambahkan baris //DEPS atrefact-id:atrefact-name:versi untuk setiap kebergantungan.
Sebagai contoh, untuk menggunakan perpustakaan jfiglet, kita boleh menambah baris berikut pada skrip: //DEPS com.github.lalyos:jfiglet:0.0.8.
> jbang init helloworld.java
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Katalog
Katalog dalam JBang membolehkan anda menyusun dan berkongsi skrip dan templat dengan cekap.
Ciri ini amat berguna untuk pasukan atau komuniti yang ingin berkongsi koleksi skrip untuk tugasan atau aliran kerja biasa.
Ia juga berguna untuk guru yang ingin mengedarkan kod permulaan atau menunjukkan hasil latihan tanpa memberikan kod sumber.
Katalog ialah fail JSON bernama jbang-catalog.json yang mengandungi dua kumpulan item: alias dan templat.
Alias membenarkan untuk menjalankan skrip daripada katalog menggunakan arahan mudah, manakala templat menyediakan titik permulaan untuk skrip baharu.
Katalog boleh menjadi jauh atau tempatan dan anda boleh menambah dan menggunakan seberapa banyak repositori tempatan atau jauh mengikut keperluan.
Adalah menarik untuk menunjukkan bahawa JBang mencipta, semasa persediaannya, katalog tempatan dengan beberapa alias dan templat di luar kotak.
JBang mencari katalog tempatan dalam direktori ini dalam susunan berikut (sumber dokumen JBang):
Direktori semasa, ./jbang-catalog.json
Dalam ./.jbang/jbang-catalog.json
Dalam direktori induk, ../jbang-catalog.json
Dalam direktori .jbang ibu bapa, ../.jbang/jbang-catalog.json
Dan ulangi langkah 3 dan 4 secara rekursif ke atas ke akar sistem fail
Sebagai langkah terakhir, ia akan kelihatan dalam $HOME/.jbang/jbang-catalog.json
JBang akan mencari katalog jauh dalam banyak repositori sumber terbuka seperti GitHub, GitLab, Bitbucket dan lain-lain.
Saya akan menggunakan GitHub sebagai contoh dalam siaran ini.
Untuk membuat katalog jauh, anda perlu menambah jbang-catalog.json pada folder akar repositori anda.
Katalog kemudiannya dirujuk oleh akaun/nama_repositori.
Jika repositori anda dinamakan jbang-catalog, maka anda boleh merujuknya mengikut akaun.
Jadi, sebagai contoh, jika akaun GitHub saya dinamakan yostane dan saya mempunyai repositori bernama cours-java yang mengandungi katalog dengan fail bernama jbang-catalog.json, saya boleh merujuk kepada katalog itu oleh yostane/cours-java. Tambahan pula, jika saya mempunyai jbang-catalog.json dalam repositori bernama jbang-catalog maka saya boleh merujuknya melalui yostane/jbang-catalog atau hanya yostane.
> jbang helloworld.java
Hello world
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Bab berikut akan menunjukkan cara menggunakan alias dan templat daripada katalog.
Alias
Alias dalam JBang membenarkan untuk menjalankan skrip daripada katalog.
Sintaks penuh ialah jbang alias@account/repository [args] dan jbang alias [args] masing-masing untuk alias jauh dan setempat.
Alias boleh ditakrifkan dalam bahagian alias pada fail katalog menggunakan format berikut:
> jbang init helloworld.java
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Berikut ialah katalog yang saya gunakan semasa sesi saya di DevoxxMA 2024.
> jbang helloworld.java
Hello world
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Anda boleh menjalankan alias ini dengan arahan berikut:
jbang palcli@yostane/cours-java puan
jbang palqrest@yostane/cours-java
jbang hellojfx@yostane/cours-java
Akaun JBang GitHub rasmi menyediakan katalog dengan banyak alias dan templat.
Mari jalankan sebahagian daripadanya:
jbang httpd@jbangdev menjalankan pelayan web tempatan.
jbang gavsearch@jbangdev [arg] cari [arg] di search.maven.org.
templat
Templat, iaitu skrip yang telah ditetapkan yang boleh digunakan sebagai titik permulaan untuk skrip baharu.
Ia ditakrifkan dalam bahagian templat fail katalog menggunakan format berikut:
///usr/bin/env jbang "<pre class="brush:php;toolbar:false">> chmod +x helloworld.java
> ./helloworld.java
Hello world
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
" "$@" ; exit $?
import static java.lang.System.*;
public class helloworld {
public static void main(String... args) {
out.println("Hello world");
}
}
Apabila templat digunakan, JBang mencipta salinan semua fail dalam sifat fail-refs.
Apabila ref fail mengandungi {basename}, JBang menggantikannya dengan nama skrip yang sedang dibuat.
Apabila ref-fail menggunakan sambungan .qute, JBang menggunakan enjin templat Qute
Berikut ialah beberapa contoh beberapa templat yang tersedia di luar kotak:
Skrip CLI yang menggunakan picocli: jbang init -t cli hellocli.java
Fail tunggal Quarkus REST API: jbang init -t qrest helloqrest.java
Kami juga boleh menggunakan templat daripada internet yang dikongsi oleh komuniti.
Contohnya, arahan ini mencipta fail ujian unit JUnit: jbang init -t junit@jbangdev file_to_test.java.
Daripada arahan itu kita boleh mencari jbang-catalog.json yang mentakrifkan tempalte dalam repositori jbangdev/jbang-catalog.
/// 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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
" "$@" ; 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()) {
StructuredTaskScope.Subtask subtask1 = scope.fork(task1);
StructuredTaskScope.Subtask subtask2 = scope.fork(task2);
scope.join();
} catch (Exception e) {
e.printStackTrace();
}
}
App Store
Gedung Apl JBang ialah apl web yang membolehkan anda menyemak imbas alias katalog diindeks.
Ia menyediakan cara yang mudah untuk menemui dan menggunakan pelbagai alatan dan utiliti tanpa memerlukan proses persediaan atau pemasangan yang rumit.
Contohnya, apabila kita mencari yostane, kita sepatutnya dapat mencari alias berbeza yang telah saya takrifkan dalam katalog saya yang berbeza.
Imej berikut menunjukkan hasil carian.
Berikut ialah beberapa skrip menarik dan lucu yang saya temui dengan menyemak imbas di App Store:
Cowsay. Berikut ialah beberapa contoh menjalankan skrip:
jbang cowsay@ricksbrown/cowsay MOO!
jbang cowsay@ricksbrown/cowsay -f naga "Saya Veldora Tempest!"
Cari subrentetan seperti grep: jbang grep@a-services "hello" .
Buat PDF daripada imej: images2pdf@a-services. Perintah berikut akan membuat fail PDF daripada dua imej:
///usr/bin/env jbang "<pre class="brush:php;toolbar:false"> {
"catalogs": {},
"aliases": {
// aliases
},
"templates": {
// templates
}
}
Salin selepas log masuk
" "$@" ; exit $?
//DEPS com.github.lalyos:jfiglet:0.0.9
import com.github.lalyos.jfiglet.FigletFont;
public class DependenciesDemo {
public static void main(String... args) throws Exception {
System.out.println(FigletFont.convertOneLine("JBang is amazing"));
}
}
Apabila anda menerbitkan katalog, kemungkinan besar ia akan muncul selepas pengindeksan seterusnya bagi JBang AppStore.
Ia adalah tindakan GitHub berjadual yang ditakrifkan di sini.
Beberapa contoh dengan frameowrk yang ketara
Dengan JBang, kami boleh mencipta aplikasi fail tunggal yang menggunakan rangka kerja dan perpustakaan yang popular.
Beberapa contoh termasuk Quarkus, picolcli dan JavaFX.
Mari terokai beberapa contoh dalam bahagian berikut.
JavaFX (openjfx)
JavaFX ialah desktop dan rangka kerja UI.
Laman web rasminya ialah openjfx.io dan turut disokong oleh Gluon yang menyediakan komponen UI tambahan dan membawa sokongan aplikasi mudah alih ke JavaFX.
JBang menyokong frameowrk ini dan boleh digunakan untuk mencipta fail isyarat aplikasi JavaFX.
Berikut ialah beberapa contoh aplikasi JavaFX yang dibuat dengan JBang:
Tetingkap asas
Contoh yang lebih cantik jbang https://gist.github.com/FDelporte/c69a02c57acc892b4c996a9779d4f830
Templat jbang init -t javafx@yostane hellojfx
Quarkus
Quarkus ialah rangka kerja Java yang dioptimumkan untuk Kubernetes dan persekitaran tanpa pelayan.
Ia menyediakan masa but yang pantas dan penggunaan memori yang rendah, menjadikannya sesuai untuk aplikasi asli awan.
Terima kasih kepada JBang, kami boleh mencipta aplikasi Quarkus satu fail yang memanfaatkan kuasa rangka kerja ini.
Contoh berikut menunjukkan API rehat yang menguji sama ada rentetan ialah palindrom. Ia mempunyai penghuraian JSON, pengelogan dan menyediakan dokumentasi OpenAPI dan Swagger.
> jbang init helloworld.java
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Kami mungkin melihat baris //SOURCES PalindromeService.java dalam skrip.
Ia memberitahu JBang untuk mencari fail bernama PalindromeService.java dalam direktori yang sama dengan skrip.
Ini bermakna JBang menyokong skrip berbilang fail.
Anda boleh menjalankan pelayan dengan jbang palqrest@yostane/cours-java dan memanggil titik akhir dengan curl http://localhost:8080/palindrome?input=madam.
> jbang helloworld.java
Hello world
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Bahasa lain
JBang menyokong menjalankan kod Java, Kotlin, JShell dan Groovy.
Ia juga boleh menjalankan kod Java daripada fail penurunan nilai.
Berikut ialah beberapa contoh cara menggunakan JBang dengan bahasa yang berbeza:
Kotlin : Anda boleh memulakan skrip Kotlin dengan jbang init -t hello.kt nama fail.kt. Sila ambil perhatian bahawa ini berbeza daripada skrip .main.kts Kotlin rasmi. Malah, skrip Kotlin yang dicipta oleh JBang boleh mendapat manfaat daripada katalog dan ciri App Store. Berikut ialah contoh skrip Kotlin yang dibuat dengan JBang.
> jbang init helloworld.java
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Fakta menarik: idea JBang datang daripada kskrip yang disasarkan kepada ekosistem Kotlin.
Kotlin sudah mempunyai sokongan skrip asli (dengan skrip .main.kts) tetapi nampaknya kekurangan katalog, templat dan ciri App Store.
Groovy : Mulakan skrip Groovy dengan jbang init -t nama fail hello.groovy.groovy. Berikut ialah contoh skrip Groovy yang dibuat dengan JBang.
> jbang helloworld.java
Hello world
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
JShell : JBang menyokong skrip JShell dengan sambungan .jsh atau .jshell dan skrip sebaris menggunakan jbang -c 'System.out.println("Java Sebaris ☕ yay!")'. Berikut ialah contoh skrip JShell yang dibuat dengan JBang.
///usr/bin/env jbang "<pre class="brush:php;toolbar:false">> chmod +x helloworld.java
> ./helloworld.java
Hello world
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
" "$@" ; exit $?
import static java.lang.System.*;
public class helloworld {
public static void main(String... args) {
out.println("Hello world");
}
}
Penurunan nilai dengan blok kod Java dan JShell : Anda boleh menjalankan blok kod Java dan JShell terus daripada fail penurunan nilai menggunakan jbang my_markdown.md.
/// 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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
" "$@" ; 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()) {
StructuredTaskScope.Subtask subtask1 = scope.fork(task1);
StructuredTaskScope.Subtask subtask2 = scope.fork(task2);
scope.join();
} catch (Exception e) {
e.printStackTrace();
}
}
Atas ialah kandungan terperinci JBang, alat skrip ekosistem Java yang hilang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!