Accueil Nos publications Blog Java 9 : À la découverte de JShell 3/3

Java 9 : À la découverte de JShell 3/3

Configuration de JShell

La configuration par défaut de JShell a été pensée de manière à le rendre utilisable rapidement et facilement pour les utilisateurs. Nous pourrions toutefois avoir envie de modifier cette configuration afin de la personnaliser en fonction de nos besoins. Une commande interne a été mise en place pour cela, il s’agit de la commande /set. Nous avions déja évoqué cette commande au cours de la première partie de ce tutoriel afin de personnaliser le retour de JShell. La commande /set peut s’utiliser dans plusieurs situations, c’est ce que nous allons étudier au cours de ce chapitre.

3.1 Personnaliser le retour de JShell

Lorsque l’on effectue une opération via JShell, vous avez pu constater que celui-ci nous affichait un message en retour (succès de la commande, erreur, type de la variable créée ainsi que sa valeur…).
Ce message peut être personnalisé à l’aide de la commande /set feedback [Type de feedback].
Cette commande s’utilise ainsi :

/set feedback : affiche le type de retour actuellement configuré ainsi que les différents modes de retours disponibles.

/set feedback normal : le feedback normal correspond au retour par défaut de JShell. Lorsque vous évaluez une expression, JShell vous renvoie le résultat correspondant ainsi que la variable interne dans laquelle la valeur a été stockée. Dans le cas d’une création de variable, JShell vous renvoie en retour le nom de la variable ainsi que la valeur correspondante. En création d’un type de données (méthode, Classe,…) JShell vous renvoie un retour précisant le type que vous venez de créer.
L’exemple qui suit résume les différents retours évoqués ci-dessus :

/set feedback verbose : le feedback verbose est le mode de retour le plus informatif. Lors de l’évaluation d’une instruction, il vous affiche le résultat correspondant ainsi que la variable interne à laquelle il a été affecté, et le type de l’expression. Il en est de même pour la création d’une variable. En ce qui concerne la création d’un type de données (méthode, Classe, etc.) le retour est identique à celui du mode normal. Voici un exemple :

/set feedback concise : ce mode de retour affiche le minimum d’informations. Lors de l’évaluation d’une expression, il vous indique le nom de la variable interne créée ainsi que le résultat de l’expression. Par contre, en ce qui concerne la création d’un type de données (variable, méthode, Classe, etc.) aucun retour n’est fait de la part de JShell (sauf si le code est en erreur) :

/set feedback silent : ce mode, comme son nom l’indique, n’affiche aucune information ! Lorsque vous entrez une expression à évaluer, JShell stocke le résultat dans une variable interne mais ne vous indique pas à l’écran le résultat correspondant. Il en est de même pour la création d’un type de données (variable, méthode, Classe…). Tout est fait en interne sans rien afficher du résultat à l’écran (sauf en cas de commande en erreur). Pour connaître la valeur d’une variable (interne ou créée par vous même) il vous faudra passer par la commande /list ou encore println par exemple :

Par défaut c’est le feedback normal qui est utilisé. Si vous modifiez le feedback de la session courante puis que vous la fermez, à l’ouverture d’une nouvelle session, JShell le remettra à sa valeur initiale. Pas très pratique lorsque l’on veut conserver son type de retour favori. Et bien là aussi JShell y a pensé ! Il existe une option que l’on peut ajouter à la commande /set feedback afin de dire à JShell de conserver notre feedback préféré pour toutes les sessions qui seront ouvertes. Il s’agit de l’option -retain. Elle s’utilise ainsi :

Après avoir vu comment modifier l’affichage de JShell, voyons maintenant comment modifier l’éditeur par défaut.

3.2 Modification de l’éditeur par défaut de JShell

Au cours du chapitre 2, nous avons vu qu’il était possible de modifier du code à partir de l’éditeur par défaut de JShell, et ce à l’aide de JShell Editor Pad. Grâce à la commande /set il est également possible de modifier l’éditeur par défaut afin d’en définir un autre. Lors du lancement de la commande /edit c’est cet éditeur qui sera alors utilisé.

Afin d’effectuer cette opération, il suffit de lancer la commande /set editor [editor].

Voici comment elle fonctionne :

/set editor : sans argument, cette commande vous affiche l’éditeur actuellement utilisé. Dans l’exemple ci-dessous, il s’agit de l’éditeur par défaut.

Supposons maintenant que nous souhaitions définir bloc note comme programme par défaut pour éditer du code. Il suffit alors de taper la commande suivante : /set editor notepad.exe :

À présent, si nous souhaitons modifier le code saisi dans l’invite de commande à l’aide de la commande /edit, l’éditeur qui s’ouvrira sera alors bien bloc note :

Bloc note étant un programme Windows, il n’y a pas besoin d’indiquer le chemin vers le .exe de notepad, il est automatiquement reconnu.
Si vous souhaitez toutefois utiliser un autre logiciel téléchargé depuis Internet, Notepad++ par exemple, il vous faudra alors renseigner le chemin vers le .exe correspondant :

Si vous tentez maintenant de modifier le code saisi à l’aide de la commande /edit, c’est Notepad++ qui s’ouvrira :

Remarque : si vous modifiez l’éditeur de JShell en renseignant un programme inexistant ou un chemin incorrect, JShell ne vous affichera pas de message d’erreur lors de l’éxécution de la commande /edit. Vous n’aurez un message d’erreur qu’au moment où vous tenterez d’ouvrir l’éditeur :

3.3 Personnaliser le démarrage de JShell

Lors de la première partie du tutoriel, nous avions vu qu’au lancement de JShell, du code était pré-chargé par défaut. Pour afficher ce code il nous suffisait de lancer la commande /list -start :

Si l’on utilise régulièrement un même code au démarrage de JShell (Classe, Interface, variable…) il est possible de demander à JShell de les charger automatiquement lorsqu’il démarre.
Comment ? Grâce à l’utilisation de la commande /set start [-retain] [Type]
La première option, -retain, indique à JShell d’enregistrer le [Type] de démarrage voulu pour les prochaines sessions JShell. Si vous ne l’indiquez pas, c’est le démarrage par défaut qui sera lancé lors de l’ouverture d’une nouvelle session.

Maintenant étudions plus en détail les types de démarrage :

/set start [-retain] -File
/set start [-retain] -Default
/set start [-retain] -none

/set start [-retain] File : indique à JShell qu’au démarrage, il doit charger le contenu du fichier File (ce fichier peut contenir du code de création de variables, méthodes, Classes…).

/set start [-retain] -none : indique à JShell de ne charger aucun code/commande lors de son démarrage.

/set start [-retain] -Default : réinitialise le démarrage de JShell à sa valeur par défaut (avec seulement les imports évoqués plus haut).

Afin de tester ces différentes commandes nous allons nous servir du fichier save.jsh que nous avions vu au cours de la deuxième partie. Pour rappel, ce fichier contient la création d’une variable x et y ainsi que le code de création d’une méthode addition :

Première remarque : comme vous l’avez surement constaté, lorsque l’on modifie le démarrage de JShell en lui demandant de charger le contenu d’un fichier, c’est exclusivement ce contenu qui est préchargé. Les imports par défaut de JShell sont absents.

Deuxième remarque : après avoir indiqué à JShell de charger le contenu d’un fichier au cours des prochaines sessions, celui-ci va stocker en cache son contenu afin de faciliter/accélérer l’ouverture des prochaines sessions. Cela signifie que si plus tard vous modifiez le contenu du fichier initialement renseigné, vos modifications ne seront pas prises en compte par JShell. Il vous faudra alors relancer de nouveau la commande /set start [-retain] -File pour qu’elles soient prises en compte :

Dans cet exemple, nous avons redéfini le démarrage de JShell à partir du fichier save.jsh.
Nous fermons ensuite la session JShell en cours, puis nous modifions le contenu du fichier pour y ajouter une variable z initialisée à 40.0.
Après ouverture d’une nouvelle session JShell, nous constatons que la variable z n’est pas reconnue :

C’est en relançant la commande de modification du démarrage de JShell que la variable z est alors bien reconnue :

Au cours de ces trois chapitres, nous avons utilisé de nombreuses commandes internes à JShell. Si vous souhaitez appronfondir vos connaissances sur ces commandes ou bien si vous avez oublié comment les utiliser, pas de panique ! Jshell possède une documentation directement accessible depuis l’invite de commande, afin d’accéder à toutes les informations dont vous avez besoin. C’est ce que nous allons voir tout de suite.

Utilisation de la documentation JShell

Une documentation très détaillée est disponible dans l’interface de JShell. Elle regorge d’informations sur JShell, ainsi que sur l’utilisation de ses commandes internes avec les différentes options appliquables.
Il est possible d’accéder à cette documentation grâce à deux commandes : /help et /?

L’exemple suivant vous montre le résultat que l’on obtient en lançant la commande /help :

JShell vous affiche les différentes commandes internes existantes avec une présentation rapide de ce qu’elles font, et pour chacune d’elles, vous pouvez accéder à une explication plus détaillée sur son utilisation. Pour cela il vous suffit d’entrer la commande /help suivie du nom de la commande à détailler, et comme au cours de ce chapitre nous avons beaucoup parlé de la commande /set, c’est celle-ci qui va nous servir d’exemple :

Nous retrouvons ici les commandes saisies au cours de cette troisième partie, que ce soit pour modifier le retour de JShell (/set feedback), pour modifier l’éditeur par défaut (/set editor) ou encore pour modifier le démarrage de JShell (/set start).
Là encore, si vous voulez obtenir davantage d’informations sur une sous-commande, il suffit de le demander à JShell :

La documentation de JShell ne se limite pas seulement aux informations concernant ses commandes internes. Elle intègre également la Javadoc !
Comment y accéder ? C’est ce que nous allons voir maintenant.

Un système d’auto-complétion a été mis en place dans JShell, que ce soit pour faciliter la saisie dans l’invite de commande ou pour afficher les possibilités correspondantes au modèle de texte saisi.
Commençons par un exemple simple. Si vous saisissez un slash dans JShell puis que vous appuyez sur la touche tabulation, vous obtiendrez l’affichage suivant :

JShell vous affiche toutes les commandes internes utilisables. Pratique quand on a oublié une commande !

Quel rapport avec la Javadoc ? Et bien la tabulation ne fonctionne pas seulement pour les commandes internes à JShell, elle fonctionne également avec du code Java.
Prenons un exemple simple, la classe String. Supposons que vous créez une String et que vous souhaitez afficher la liste des méthodes de la classe correspondante.
En tapant votre [String]. suivi de la touche tabulation, JShell va vous afficher l’ensemble des méthodes de la classe String :

Supposons maintenant que nous voulons avoir des informations concernant la méthode charAt. Il suffit de saisir notre [chaine].charAt( suivi de la touche tabulation. Nous obtenons alors ceci :

La description de la méthode s’effectue en deux temps. Tout d’abord, JShell va simplement vous afficher la signature de la méthode (au cas où vous voudriez seulement vous souvenir de comment l’utiliser). Si par contre vous voulez lire toute la Javadoc correspondante, il vous faut alors appuyer une seconde fois sur la touche tabulation :

Voilà ! Vous disposez à présent des bases nécessaires à la personnalisation de JShell, en fonction de l’utilisation que vous en ferez. Et si vous avez besoin d’aide au cours de vos tâches, n’oubliez pas que JShell possède une documentation très fournie qui est là pour vous aider.

Conclusion

Java possède enfin son propre REPL. JShell permet de tester rapidement du code Java sans avoir à compiler puis éxécuter des programmes complets. Cette série de trois articles a pour but de vous présenter les bases de son utilisation afin de vous permettre de faire vos tests rapidement.
Sachez toutefois qu’il est possible de faire davantage de choses avec JShell (comme par exemple créer votre propre feedback !).
Il existe également une API JShell que vous pouvez intégrer dans votre IDE afin de l’utiliser directement depuis votre logiciel favori et non plus depuis une invite de commande.