Programme java console (CLI)

Résolu/Fermé
mikis69 Messages postés 168 Date d'inscription mardi 26 novembre 2013 Statut Membre Dernière intervention 11 février 2019 - 26 févr. 2017 à 22:45
mikis69 Messages postés 168 Date d'inscription mardi 26 novembre 2013 Statut Membre Dernière intervention 11 février 2019 - 28 févr. 2017 à 23:24
Bonjour à tous et à toutes,

J'aimerai réaliser une application console en java et qui s'utilise comme une console windows par exemple (on lance l'application, on attend que l'utilisateur entre une commande jusqu'à ce qu'il écrive 'exit') comme git bash par exemple.

Le soucis est le suivant, je ne trouve rien sur internet dans ce style là, je trouve beaucoup de choses sur par exemple faire une application en console et comment gérer les paramètres lors du lancement de l'application. Mais ce n'est pas vraiment ce que je cherche, est-ce que quelqu'un connait une librairie sympas à utiliser ?
Ou alors peut m'orienter vers quelque chose qui me permettrait de commencer mon programme ?

En gros, j'aimerai faire un programme qui ressemble à ceci :

1. L'utilisateur lance l'application
2. L'application attend une entrée de l'utilisateur
3. L'utilisateur entre une commande (genre dans mon cas import -git "depotGit.git")
4. L'application vérifie que la commande entrée existe et est bien utilisée
5. L'application exécute la commande
6. L'utilisateur entre la commande 'exit'
7. L'application se ferme

Si aucune librairie n'existe, je pense pouvoir le faire 'à la main' mais je ne sais pas si c'est une bonne solution..
Je pensais mettre le tout dans un 'tant que l'utilisateur n'entre pas exit' lire les entrées de l'utilisateur; Découper les entrées pour récupérer les parties de l'entrée; Dans un switch, je vérifie si la commande est correcte et je lance les méthodes adéquates;

Merci pour votre temps et votre réponse,

Bonne nuit,

Mikis
A voir également:

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
26 févr. 2017 à 23:22
Bonjour,

Une petite recherche sur Google remonte très vite des résultats utiles.
Sur la première page de résultats on a déjà 4 librairies qui pourraient plus ou moins correspondre à ce que tu recherches...

https://commons.apache.org/proper/commons-cli/
https://pholser.github.io/jopt-simple/
http://jcommander.org/
http://args4j.kohsuke.org/
1
mikis69 Messages postés 168 Date d'inscription mardi 26 novembre 2013 Statut Membre Dernière intervention 11 février 2019
27 févr. 2017 à 00:13
Merci pour ta réponse,

Oui, je les ai déjà essayées mais elles ne correspondent pas à ce que je veux faire.. La plupart permettent de gérer les arguments passés lors du lancement du programme (d'après les exemples et les tests que j'ai fait).. J'ai également essayé de les modifier pour arriver à ce que je voulais mais je n'y suis pas arrivé. C'est pour cela que je suis venu demander de l'aide ici ! (J'avais évidemment déjà effectué mes recherches sur google)

Je ne sais pas vraiment quel terme recherché sur google pour ce que je veux, j'ai essayé console program like git bash par exemple (car je ne sais pas comment s'appelle ce que j'essaie de faire)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
27 févr. 2017 à 07:03
Si je regarde (vite fait, sans tester) Apache Commons CLI, le code d'exemple est :

public static void main( String[] args ) {
    // create the parser
    CommandLineParser parser = new DefaultParser();
    try {
        // parse the command line arguments
        CommandLine line = parser.parse( options, args );
    }
    catch( ParseException exp ) {
        // oops, something went wrong
        System.err.println( "Parsing failed.  Reason: " + exp.getMessage() );
    }
}

A priori il devrait être facile de l'adapter pour lire une commande tapée au clavier.

public static void exec(String command) {
    // split the command
    String[] args = command.split("\\s");

    // create the parser
    CommandLineParser parser = new DefaultParser();
    try {
        // parse the command line arguments
        CommandLine line = parser.parse( options, args );
    }
    catch( ParseException exp ) {
        // oops, something went wrong
        System.err.println( "Parsing failed.  Reason: " + exp.getMessage() );
    }
}

Attention, il y a des cas particuliers où il ne faut pas splitter sur l'espace.
Par exemple lorsque l'on met des guillemets,
tata -toto "titi tutu"
devrait être splitté en
{"tata", "-toto", "titi tutu"}
alors que mon
split("\\s")
donnera
{"tata", "-toto", "titi", "tutu"}
, mais ce n'est pas trop dur à contourner.
0
mikis69 Messages postés 168 Date d'inscription mardi 26 novembre 2013 Statut Membre Dernière intervention 11 février 2019
27 févr. 2017 à 15:15
J'ai effectivement réussi à l'adapter pour prendre en entrée les saisies au clavier de l'utilisateur mais par contre je ne comprend pas trop leur système d'options.

Dans mon programme par exemple, on pourrait entrer la commande import mais après, il faudrait lui donner un type : "git" ou "local' ensuite suivant ce type, il y aurait d'autres paramètre à donner : l"url pour git, le chemin accès pour local.

Et ici avec cette librairie, je ne trouve pas le moyen de définir les options de manière précise, avec les arguments qui doivent être vérifiés etc..

Par exemple, je peux utiliser la classe Option

 Option import = new Option("import", true, "Importer mais de quelle facon ?");


Mais ca ne vérifiera pas ce qui suit import
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
27 févr. 2017 à 21:15
Tu peux récupérer la valeur de l'import avec la méthode getOptionValue.

Exemple :

import org.apache.commons.cli.*;

public class Test {

    public static Options buildOptions() {
        Options options = new Options();
        options.addOption(new Option("import", true, "Importer mais de quelle facon ?"));
        return options;
    }

    public static CommandLine exec(Options options, String... commands) throws ParseException {
        return new DefaultParser().parse(options, commands);
    }

    public static void main(String... args) throws ParseException {
        CommandLine commandLine = exec(buildOptions(), "git", "-import", "fichier");
        System.out.println(commandLine.getOptionValue("import")); // fichier
    }
}
0
mikis69 Messages postés 168 Date d'inscription mardi 26 novembre 2013 Statut Membre Dernière intervention 11 février 2019
Modifié par mikis69 le 28/02/2017 à 01:47
Merci pour ce morceau de code que je comprend bien !

Maintenant pour être franc (et sans mauvaise volonté car j'ai cherché une bonne partie de la journée), je ne vois vraiment pas comment utiliser ces options.

Par exemple lorsque mon programme est lancé, je peux entrer ceci comme commande :

-git "url.git" -d ou cette commande -git "url.git"

Et je ne vois pas comment je peux dire que le -d n'est pas obligatoire et qu'en plus il ne peut être utilisé qu'avec la commande -git (car ca n'aurait pas de sens de l'utiliser avec -local par exemple). Je ne trouve rien sur le fait de lier plusieurs options entre elles.

Car avec ce que je vois pour l'instant l'utilisateur pourrait très bien faire -d tout seul aussi..
Et donc ce ne serait pas cohérent car concrétement mon programme aura quelques commandes du style : import, tokenize, help, exit (voilà les seuls commandes que l'utilisateur peut entrer).

S'il entre import, il va devoir passer des arguments à côté du style -git ou -local (+ les paramètres qui vont avec)
Mais rien n'empechera ici l'utilisateur de carrément entrer -import -git -local..
Je vais devoir vérifier les entrées de l'utilisateur dans un switch ? Car si c'est le cas, c'est pas très utile d'utiliser cette librairie, si ?

Fin je ne sais pas si je suis clair sur mes besoins.. Si ca ne l'est pas, n'hésite pas à me le dire afin que je réexplique.

Merci en tout cas !
0