Programme java console (CLI)

Résolu/Fermé
Signaler
Messages postés
168
Date d'inscription
mardi 26 novembre 2013
Statut
Membre
Dernière intervention
11 février 2019
-
Messages postés
168
Date d'inscription
mardi 26 novembre 2013
Statut
Membre
Dernière intervention
11 février 2019
-
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

1 réponse

Messages postés
16438
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2021
2 918
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41989 internautes nous ont dit merci ce mois-ci

Messages postés
168
Date d'inscription
mardi 26 novembre 2013
Statut
Membre
Dernière intervention
11 février 2019
1
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
Messages postés
16438
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2021
2 918
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
    }
}
Messages postés
168
Date d'inscription
mardi 26 novembre 2013
Statut
Membre
Dernière intervention
11 février 2019
1
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 !
Messages postés
16438
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2021
2 918
Je ne peux que t'inciter à consulter la documentation qui est fourni sur le site.
Ne connaissant pas personnellement cette bibliothèque c'est de toute façon ce que je devrais faire pour te l'expliquer donc autant que tu le fasses par toi même...

"Je ne trouve rien sur le fait de lier plusieurs options entre elles"
C'est normal a priori. Chaque option est indépendante, si tu dois utiliser un jeu d'options différents pour deux actions distinctes, alors c'est sûrement que tu devrais faire plusieurs commandes différentes, chacune avec ses options.
Messages postés
168
Date d'inscription
mardi 26 novembre 2013
Statut
Membre
Dernière intervention
11 février 2019
1
J'ai effectué beaucoup de recherches et je suis finalement tombé sur un terme qui est :

REPL (real eval print loop) et qui est un terme désignant une application qui prend des inputs de l'utilisateur à l'infini jusqu'à ce qu'il entre une commande de fin.. Néanmoins, je ne trouve pas vraiment de librairie permettant de faire ceci facilement.
J'ai donc décidé de le faire personnellement 'à la main' avec une classe Commande, une classe Paramètre, un Controller (qui va vérifier les entrées) donc que la commande entrée soit bien paramétrée (nombre de paramètre obligatoire) etc..

En tout cas, je te remercie de m'avoir conseillé..