% Interactive Shell in Java
Interface Homme Machine
Les applications ont bien souvent une IHM, elle peut être de type GUI (Graphique) ou CLI (Texte).
En fait, CLI peut signifier trois niveau d’interface :
- L’interface de la ligne de commande, donc l’analyse des arguments passés à l’exécutable.
- L’interaction via une console (shell) intégrée dans l’application.
- L’affichage d’une interface utilisateur complète avec des bouton, menus, onglets, mais en mode texte (comme
ncurses
).
Arguments de la ligne de commande
Pour gérer les arguments de la ligne de commande, la plate-forme Java ne fournit aucune facilité à part un bricolage autour des classes InputStreamReader
et BufferedReader
.
Certaines applications utilisent l’astuce de l’option -Dproperty=value
de la commande java pour récupérer des valeurs sans avoir à analyser les arguments de la ligne de commande.
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html
Pour analyser les arguments de la ligne de commande, le développeur a deux possibilités. La première consiste à ne pas rajouter de dépendance à son projet et va se restreindre à une analyse basique des arguments de la ligne de commande en évitant de réinventer la roue. La seconde possibilité consiste à rajouter une des nombreuses bibliothèques disponibles :
- Commons CLI http://commons.apache.org/cli/
- Java Gems http://code.google.com/p/javagems/
- JArgs http://jargs.sourceforge.net/
- GetOpt http://www.urbanophile.com/arenn/hacking/download.html
- JOpt Simple http://jopt-simple.sourceforge.net/
- Args4J https://args4j.dev.java.net/
- ArgParser http://people.cs.ubc.ca/~lloyd/java/argparser.html
- Natural CLI http://naturalcli.sourceforge.net/
- TE-Code http://te-code.sourceforge.net/
- JSAP http://www.martiansoftware.com/jsap/
- CLAJR http://clajr.sourceforge.net/
- CmdLn http://ostermiller.org/utils/CmdLn.html
- JewelCli http://jewelcli.lexicalscope.com/
- JCommando http://jcommando.sourceforge.net/
- Parse-cmd http://code.google.com/p/parse-cmd/
- Airline (active Fork: https://github.com/rvesse/airline)
- argparse4j
- cli-parser
- Commandline
- DocOpt.java
- dolphin getopt
- DPML CLI (Jakarta Commons CLI2 fork)
- Dr. Matthias Laux
- Jakarta Commons CLI
- jargo
- jargp
- JArgs
- java-getopt
- JCLAP
- jcmdline
- jcommander
- Object Mentor CLI article (more about refactoring and TDD)
- ritopt
- Rop
- Google-options https://github.com/pcj/google-options (d’après le projet Bazel)
Trois générations de bibliothèques :
- Parmi ces différentes bibliothèques, les plus anciennes miment le fonctionnement des bibliothèques des autres langages (c’est le cas de JArgs).
- D’autres bibliothèque profitent de la réflexion disponible dans le langage Java (selon le nom des variables membres ou des fonction).
- Enfin, d’autres bibliothèque tirent parti des annotations et nécessitent souvent une version de Java récente (Java 8).
Console interactive
La plate-forme Java fournit quelques classes de base comme
java.io.Console
(exemple) et
java.util.Scanner
(exemple 1 et
2).
Des bibliothèques permettent d’aller plus loin.
Cliche
En 2009, l’auteur Anton Grigoryev, a migré ce projet sur SourceForge. http://cliche.sourceforge.net/
En 2011, le projet est migré sur Google Code, site qui ferme en 2016.
Parmi les dépôts Git du présumé auteur sur GitHub, aucun projet nommé Cliche.
Par contre, de nombreuses personnes ont archivé ce projet sur GitHub avant la fermeture de Google Code, dont le projet le plus à jour et celui de Budhaditya :
https://github.com/budhash/cliche
Un article de 2015 explique comment l’utiliser :
https://opensourceforu.com/2015/09/cliche-speeding-up-command-line-interface-development/
JLine
En 2002, ce vieux projet débute sur SourceForge : http://jline.sourceforge.net/
dont sa dernière version était JLine-1.0 (avril 2011).
En 2009, le projet commence sa migration sur GitHub. : http://jline.github.io/jline2/
et délivre la série 2.x depuis novembre 2009 (version 2.0).
La dernière version de cette série est la 2.14.2 publiée en mai 2016.
En octobre 2016, une nouvelle série 3.x est publiée : https://github.com/jline/jline3/releases
Groovy utilise JLine pour son shell groovysh
: http://groovy-lang.org/groovysh.html