JBang fournit un moyen d'exécuter du code Java sous forme de script, similaire à JShell. Cependant, contrairement à JShell, JBang fonctionne très bien sur Java 8 et peut également être utilisé pour télécharger automatiquement des bibliothèques dépendantes. En fait, JBang peut même fonctionner sans que Java soit installé : il téléchargera simplement une JVM appropriée si nécessaire.
JBang est un launcher de script, écrit en Bash et Powershell, qui peut découvrir ou télécharger une JVM, puis charger (télécharger) le script Java passé en argument. L'implémentation de JBang est une archive Java JAR, qui est lancée pour exécuter d'autres commandes.
JBang peut exécuter des fichiers jsh ou java; ce dernier est une classe Java standard avec une méthode main()
. Cependant, contrairement à JShell, les commentaires en haut de JBang permettent aux dépendances d'être automatiquement téléchargées et configurées dans le classpath. JShell permet d'ajouter des fichiers JAR au classpath au lancement, mais toutes les dépendances (récursives) doivent être ajoutées manuellement.
Par exemple, pour exécuter une application Java qui imprime du texte à l'aide de la dépendance (GPL) jfiglef, vous pouvez exécuter le script suivant avec JBang :
//usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS com.github.lalyos:jfiglet:0.0.8
import com.github.lalyos.jfiglet.FigletFont;
class hello {
public static void main(String... args) throws Exception {
System.out.println(FigletFont.convertOneLine("Hello InfoQ"));
}
}
Après avoir installé jbang avec sdkman ou en le téléchargeant, exécuter jbang run hello.java InfoQ
affichera :
_ _ _ _ ___ __ ___
| | | | ___ | | | | ___ |_ _| _ __ / _| ___ / _ \
| |_| | / _ \ | | | | / _ \ | | | '_ \ | |_ / _ \ | | | |
| _ | | __/ | | | | | (_) | | | | | | | | _| | (_) | | |_| |
|_| |_| \___| |_| |_| \___/ |___| |_| |_| |_| \___/ \__\_\
L'avantage d'utiliser jBang est qu'il téléchargera les dépendances en fonction du commentaire //DEPS
en haut du fichier à partir du référentiel jcenter; il suivra ensuite les dépendances récursives pour s'assurer que tout ce qui est requis pour l'exécution se trouve dans le classpath. Cela permet aux applications plus complexes d'être scriptées à partir de la ligne de commande. En outre, les dépendances peuvent également être spécifiées en tant que liens directs vers les référentiels GitHub, soit en tant que branche, soit en tant que release tagguée. Pour les utilisations internes, il est possible de spécifier des référentiels supplémentaires à l'aide du commentaire //REPOS
, tel que //REPOS mavenCentral,artifactory=https://example.com/repository
Plusieurs versions de Java sont prises en charge et peuvent être requises avec un commentaire //JAVA8
ou //JAVA11+
qui utilisera exactement Java 8 ou Java 11 et supérieur respectivement. Les JVM sont téléchargées à partir du site AdoptOpenJDK pour le système d'exploitation sur lequel la commande est exécutée. Entre autres choses, cela permet de tester très facilement des applications avec Java 11, 14, 15 etc. car le script jbang
a une option --java qui permet l'exécution du script en utilisant la version spécifiée; ainsi vous pouvez exécuter jbang run --java 11 hello.java
ou jbang run --java 14 hello.java
pour exécuter le même script sous les deux versions de JVM.
Vous n'avez même pas besoin de faire extraire le script, car le code peut être téléchargé à partir d'une source distante. L'exécution de l'exemple ci-dessus peut être effectuée simplement en pointant sur l'URL contenant le script :
$ jbang run --java 15 https://github.com/jbangdev/jbang-replit-demo/blob/master/hello.java InfoQ
_ _ _ _ ___ __ ___
| | | | ___ | | | | ___ |_ _| _ __ / _| ___ / _ \
| |_| | / _ \ | | | | / _ \ | | | '_ \ | |_ / _ \ | | | |
| _ | | __/ | | | | | (_) | | | | | | | | _| | (_) | | |_| |
|_| |_| \___| |_| |_| \___/ |___| |_| |_| |_| \___/ \__\_\
Enfin, vous pouvez même exécuter jbang
sans installer jbang
: un script de lancement est disponible (sous la forme de scripts Bash et PowerShell) :
$ curl -Ls https://sh.jbang.dev | bash -s - https://github.com/jbangdev/jbang-replit-demo/blob/master/hello.java InfoQ
PS C:> iex "& { $(iwr https://ps.jbang.dev) } https://github.com/jbangdev/jbang-replit-demo/blob/master/hello.java InfoQ
Pour plus d'informations sur jbang, consultez sa page d'accueil à l'adresse https://jbang.dev ou le référentiel GitHub à l'adresse https://github.com/jbangdev/jbang.