Maison > Java > javaDidacticiel > JBang, l'outil de script manquant de l'écosystème Java

JBang, l'outil de script manquant de l'écosystème Java

Patricia Arquette
Libérer: 2025-01-05 04:01:39
original
192 Les gens l'ont consulté

L'écosystème Java dispose déjà de deux puissants outils de gestion de projet, à savoir Maven et Gradle, mais il lui manquait un outil de script simple et puissant.
C'est là qu'intervient JBang.
C'est un lanceur de fichiers Java, Kotlin et Groovy minimaliste mais puissant.
En fait, il vous permet d'exécuter du code aussi facilement que vous exécuteriez un script.
Il fournit également de nombreuses autres fonctionnalités telles que la gestion des dépendances, des modèles et un App Store.
Explorons JBang et ses fonctionnalités dans cet article.

Installation

La ligne de commande jbang peut être installée sur Windows, Linux et macOS en utilisant différentes méthodes bien documentées ici.
Nous pouvons vérifier l'installation en exécutant jbang --version.

En plus de cela, il est préférable d'installer l'extension IDE qui l'accompagne pour notre IDE préféré.
Les extensions IDE prises en charge sont répertoriées ici.

JBang ne dépend pas d'un JDK vers JRE mais un JDK est requis pour exécuter des scripts utilisant Java.
Vous pouvez en installer un avec JBang en exécutant jbang jdk install 23 qui installera le JDK 23.

Nous sommes maintenant prêts à écrire nos premiers scripts.

Premier scénario

Créons un script simple qui imprime « Hello, World ! » à la console.

> jbang init helloworld.java
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Cela créera un fichier nommé helloworld.java qui pourra être exécuté avec jbang helloworld.java.

> jbang helloworld.java
Hello world
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Lorsque vous ouvrez le fichier, vous verrez qu'il s'agit d'un simple fichier Java avec une méthode principale et une première ligne particulière.

///usr/bin/env jbang "<pre class="brush:php;toolbar:false">> chmod +x helloworld.java
> ./helloworld.java
Hello world
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
" "$@" ; exit $? import static java.lang.System.*; public class helloworld { public static void main(String... args) { out.println("Hello world"); } }

Comme nous le verrons, le script JBang est composé de trois parties : le shebang, les propriétés facultatives et le script lui-même.
Nous utiliserons certaines propriétés dans la deuxième partie dans les sections suivantes mais concentrons-nous sur la première partie.

Cette partie ///usr/bin/env jbang "$0" "$@" ; sortir $? indique au système d'utiliser JBang pour exécuter le script.
C'est ce qu'on appelle un shebang dans l'écosystème Unix et est utilisé pour spécifier l'interprète du script.
Nous pouvons illustrer cela sur un système Unix (macOS, Linux) en exécutant chmod x helloworld.java pour rendre le script exécutable puis en exécutant ./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
Copier après la connexion
Copier après la connexion
Copier après la connexion
" "$@" ; 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(); } }

Nous pouvons désormais développer notre script comme nous le ferions avec n'importe quel fichier Java.
Une fois prêt à être publié, nous pouvons l'exporter dans différents formats comme suit :

  • Un fichier jar : jbang export portable helloworld.java. Si votre script utilise des dépendances, les commandes suivantes sont plus recommandées.
  • Un fatjar : qui contient toutes les dépendances : jbang export fatjar helloworld.java. Cette méthode nécessite tout de même d'installer un JDK/JRE sur la machine cible. Si vous ne le souhaitez pas, les commandes suivantes sont plus recommandées.
  • Un binaire jlink qui englobe un JDK : jbang export jlink helloworld.java. Le binaire à exécuter est soit helloworld-jlink/bin/helloworld sous Unix, soit helloworld-jlink/bin/helloworld.bat sous Windows.
  • Une imgae native : jbang export native helloworld.java. Cela nécessite une installation GraalVM.

Le script peut également être exporté en mavenrepo avec : jbang export mavenrepo helloworld.java

Gestion du JDK

Comme vu dans un chapitre précédent, JBang peut installer des JDK sur votre machine.
Vous pouvez lister les JDK installés avec jbang jdk list, lister ceux disponibles à installer avec jbang jdk list --available --show-details, en installer un nouveau avec jbang jdk install [version]. Jbang prend également en charge l'utilisation de SDKMAN pour gérer les JDK sur les systèmes pris en charge.

De plus, il est possible de spécifier une version du JDK dans un script.
Cela se fait en ajoutant la ligne suivante aux propriétés du script : //JAVA [version] si l'on veut une version exacte ou //JAVA [version] si l'on veut au moins une version spécifique.
Dans ce cas, JBang installera automatiquement la version requise du JDK et l'utilisera uniquement pour ce script sans modifier le JDK par défaut du système.

Par exemple, le script suivant utilise Java 25 et certaines fonctionnalités d'aperçu.

> jbang init helloworld.java
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Scripts sans classe "Main"

Les scripts ayant tendance à être légers, il serait préférable de les écrire sans classe ni méthode principale.
Heureusement, Java dispose d'une fonctionnalité appelée classes déclarées implicites et méthodes principales d'instance (qui est toujours en aperçu dans Java 23).
Cette fonctionnalité permet d'écrire des programmes Java et des scripts JBang sans classe ni méthode principale statique.

Le script suivant sera compilé et exécuté sans aucun problème.

> jbang helloworld.java
Hello world
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ceci est rendu possible en ajoutant les propriétés suivantes au script.

///usr/bin/env jbang "<pre class="brush:php;toolbar:false">> chmod +x helloworld.java
> ./helloworld.java
Hello world
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
" "$@" ; exit $? import static java.lang.System.*; public class helloworld { public static void main(String... args) { out.println("Hello world"); } }

La première ligne, //JAVA 23, indique à JBang d'utiliser Java 23 ou une version ultérieure.
Les deuxième et troisième lignes, //COMPILE_OPTIONS --enable-preview -source 23 et //RUNTIME_OPTIONS --enable-preview, activent respectivement les fonctionnalités d'aperçu pour la compilation et l'exécution.

Une fois la fonctionnalité devenue stable, nous pouvons supprimer les 3 lignes et le script fonctionnera toujours. Propre !

Dépendances

JBang prend en charge l'ajout de dépendances aux scripts sous la forme de dépendances de style Gradle en ajoutant une ligne //DEPS atrefact-id:atrefact-name:version pour chaque dépendance.
Par exemple, pour utiliser la bibliothèque jfiglet, on peut ajouter la ligne suivante au script : //DEPS com.github.lalyos:jfiglet:0.0.8.

> jbang init helloworld.java
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Catalogues

Les catalogues dans JBang permettent d'organiser et de partager efficacement des scripts et des modèles.
Cette fonctionnalité est particulièrement utile pour les équipes ou les communautés qui souhaitent partager une collection de scripts pour des tâches ou des flux de travail courants.
Il est également utile pour les enseignants qui souhaitent distribuer des codes de démarrage ou afficher les résultats d'exercices sans fournir le code source.

Un catalogue est un fichier JSON nommé jbang-catalog.json qui contient deux groupes d'éléments : les alias et les modèles.
Les alias permettent d'exécuter des scripts à partir d'un catalogue à l'aide d'une simple commande, tandis que les modèles fournissent un point de départ pour de nouveaux scripts.
Les catalogues peuvent être distants ou locaux et il est possible d'ajouter et d'utiliser autant de référentiels locaux ou distants que nécessaire.
Il est intéressant de souligner que JBang crée, lors de sa configuration, un catalogue local avec quelques alias et modèles prêts à l'emploi.

JBang recherche les catalogues locaux dans ces répertoires dans l'ordre suivant (source JBang docs) :

  1. Répertoire actuel, ./jbang-catalog.json
  2. Dans ./.jbang/jbang-catalog.json
  3. Dans le répertoire parent, ../jbang-catalog.json
  4. Dans le répertoire .jbang du parent, ../.jbang/jbang-catalog.json
  5. Et répéter les étapes 3 et 4 de manière récursive vers le haut jusqu'à la racine du système de fichiers
  6. Comme dernière étape, il apparaîtra dans $HOME/.jbang/jbang-catalog.json

JBang recherchera à distance les catalogues dans de nombreux référentiels open source comme GitHub, GitLab, Bitbucket et autres.
J'utiliserai GitHub comme exemple dans cet article.
Pour créer un catalogue distant, vous devez ajouter jbang-catalog.json au dossier racine de votre référentiel.
Le catalogue est ensuite référencé par account/repository_name.
Si votre référentiel s'appelle jbang-catalog, vous pouvez y faire référence par compte.
Ainsi, par exemple, si mon compte GitHub s'appelle yostane et que j'ai un référentiel nommé cours-java qui contient un catalogue dont un fichier nommé jbang-catalog.json, je peux faire référence à ce catalogue par yostane/cours-java. De plus, si j'ai un jbang-catalog.json dans un référentiel nommé jbang-catalog alors je peux y faire référence par yostane/jbang-catalog ou simplement yostane.

> jbang helloworld.java
Hello world
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Les chapitres suivants montreront comment utiliser les alias et les modèles d'un catalogue.

Alias

Les alias dans JBang permettent d'exécuter des scripts à partir d'un catalogue.
La syntaxe complète est jbang alias@account/repository [args] et jbang alias [args] pour respectivement un alias distant et local.

Les alias peuvent être définis dans la section alias du fichier catalogue en utilisant le format suivant :

> jbang init helloworld.java
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Voici le catalogue que j'ai utilisé lors de ma session au DevoxxMA 2024.

> jbang helloworld.java
Hello world
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Vous pouvez exécuter ces alias avec les commandes suivantes :

  • jbang palcli@yostane/cours-java madame
  • jbang palqrest@yostane/cours-java
  • jbang hellojfx@yostane/cours-java

Le compte officiel JBang GitHub fournit un catalogue avec de nombreux alias et modèles.
Lançons-en quelques-uns :

  • jbang httpd@jbangdev exécute un serveur Web local.
  • jbang gavsearch@jbangdev [arg] recherchez [arg] sur search.maven.org.

Modèles

Modèles, qui sont des scripts prédéfinis qui peuvent être utilisés comme point de départ pour de nouveaux scripts.
Ils sont définis dans la section modèles du fichier catalogue au format suivant :

///usr/bin/env jbang "<pre class="brush:php;toolbar:false">> chmod +x helloworld.java
> ./helloworld.java
Hello world
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
" "$@" ; exit $? import static java.lang.System.*; public class helloworld { public static void main(String... args) { out.println("Hello world"); } }

Lorsqu'un modèle est utilisé, JBang crée des copies de tous les fichiers dans la propriété file-refs.
Lorsqu'une référence de fichier contient {basename}, JBang le remplace par le nom du script en cours de création.
Lorsqu'une référence de fichier utilise l'extension .qute, JBang utilise le moteur de création de modèles Qute

Voici quelques exemples de modèles disponibles prêts à l'emploi :

  • Un script CLI qui utilise picocli : jbang init -t cli hellocli.java
  • Une API REST Quarkus à fichier unique : jbang init -t qrest helloqrest.java

Nous pouvons également utiliser des modèles provenant d'Internet partagés par la communauté.
Par exemple, cette commande crée un fichier de test unitaire JUnit : jbang init -t junit@jbangdev file_to_test.java.
À partir de la commande, nous pouvons localiser le jbang-catalog.json qui a défini le modèle dans le référentiel 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
Copier après la connexion
Copier après la connexion
Copier après la connexion
" "$@" ; 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(); } }

Magasin d'applications

Le JBang App Store est une application web qui permet de parcourir les alias des catalogues indexés.
Il offre un moyen pratique de découvrir et d'utiliser divers outils et utilitaires sans avoir besoin de processus de configuration ou d'installation complexes.
Par exemple, lorsqu'on recherche Yostane, on devrait pouvoir retrouver les différents alias que j'ai définis dans mes différents catalogues.
L'image suivante montre le résultat de la recherche.

JBang, the missing scripting tool of the Java ecosystem

Voici quelques scripts intéressants et amusants que j'ai trouvés en parcourant l'App Store :

  • Cowsay. Voici quelques exemples d’exécution du script :
    • jbang cowsay@ricksbrown/cowsay MOO !
    • jbang cowsay@ricksbrown/cowsay -f dragon "Je suis Veldora Tempest !"
  • Trouver une sous-chaîne comme grep : jbang grep@a-services "hello" .
  • Créez un PDF à partir d'images : images2pdf@a-services. Les commandes suivantes créeront un fichier PDF à partir de deux images :
///usr/bin/env jbang "<pre class="brush:php;toolbar:false">  {
    "catalogs": {},
    "aliases": {
      // aliases
    },
    "templates": {
      // templates
    }
  }
Copier après la connexion
" "$@" ; 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")); } }

Lorsque vous publiez un catalogue, il apparaîtra très probablement après la prochaine indexation du JBang AppStore.
Il s'agit d'une action GitHub planifiée définie ici.

Quelques exemples avec des frameworks notables

Avec JBang, nous pouvons créer des applications à fichier unique qui utilisent des frameworks et des bibliothèques populaires.
Quelques exemples incluent Quarkus, picolcli et JavaFX.
Explorons quelques exemples dans les sections suivantes.

JavaFX (openjfx)

JavaFX est un framework de bureau et d'interface utilisateur.
Son site officiel est openjfx.io et est également pris en charge par Gluon qui fournit des composants d'interface utilisateur supplémentaires et apporte la prise en charge des applications mobiles à JavaFX.
JBang prend en charge ce framework et peut être utilisé pour créer des applications JavaFX à fichier unique.

Voici quelques exemples d'applications JavaFX créées avec JBang :

  • Fenêtre de base
  • Plus bel exemple de jbang https://gist.github.com/FDelporte/c69a02c57acc892b4c996a9779d4f830
  • Un modèle jbang init -t javafx@yostane hellojfx

Quarkus

Quarkus est un framework Java optimisé pour les environnements Kubernetes et sans serveur.
Il offre un temps de démarrage rapide et une faible consommation de mémoire, ce qui le rend idéal pour les applications cloud natives.

Grâce à JBang, nous pouvons créer des applications Quarkus à fichier unique qui exploitent la puissance de ce framework.
L'exemple suivant montre une API rest qui teste si une chaîne est un palindrome. Il dispose d'une analyse JSON, d'une journalisation et fournit une documentation OpenAPI et Swagger.

> jbang init helloworld.java
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Nous pouvons remarquer une ligne //SOURCES PalindromeService.java dans le script.
Il indique à JBang de rechercher un fichier nommé PalindromeService.java dans le même répertoire que le script.
Cela signifie que JBang prend en charge les scripts multi-fichiers.

Vous pouvez exécuter le serveur avec jbang palqrest@yostane/cours-java et appeler le point final avec curl http://localhost:8080/palindrome?input=madam.

> jbang helloworld.java
Hello world
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Autres langues

JBang prend en charge l'exécution du code Java, Kotlin, JShell et Groovy.
Il peut même exécuter du code Java à partir de fichiers markdown.
Voici quelques exemples d'utilisation de JBang avec différentes langues :

  • Kotlin : Vous pouvez initialiser un script Kotlin avec jbang init -t hello.kt filename.kt. Veuillez noter que ceci est différent des scripts officiels .main.kts Kotlin. En fait, les scripts Kotlin créés par JBang peuvent bénéficier des fonctionnalités du catalogue et de l'App Store. Voici un exemple de script Kotlin créé avec JBang.
> jbang init helloworld.java
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
  • Fait intéressant : l'idée de JBang est venue de kscript qui est destiné à l'écosystème Kotlin.
  • Kotlin prend déjà en charge les scripts natifs (avec les scripts .main.kts) mais semble manquer des fonctionnalités de catalogue, de modèle et de l'App Store.
    • Groovy : Initialisez un script Groovy avec jbang init -t hello.groovy filename.groovy. Voici un exemple de script Groovy créé avec JBang.
> jbang helloworld.java
Hello world
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
  • JShell : JBang prend en charge les scripts JShell avec les extensions .jsh ou .jshell et les scripts en ligne utilisant jbang -c 'System.out.println("Inline Java ☕ yay!")'. Voici un exemple de script JShell créé avec JBang.
///usr/bin/env jbang "<pre class="brush:php;toolbar:false">> chmod +x helloworld.java
> ./helloworld.java
Hello world
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
" "$@" ; exit $? import static java.lang.System.*; public class helloworld { public static void main(String... args) { out.println("Hello world"); } }
  • Markdown avec des blocs de code Java et JShell : Vous pouvez exécuter des blocs de code Java et JShell directement à partir d'un fichier markdown en utilisant 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
Copier après la connexion
Copier après la connexion
Copier après la connexion
" "$@" ; 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(); } }

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal