web-dev-qa-db-fra.com

Apache Commons CLI - type d'option et valeur par défaut

Comment puis-je donner à une option CLI un type - tel que int ou Integer? (Plus tard, comment puis-je obtenir la valeur analysée avec un seul appel de fonction?)

Comment puis-je donner à une option CLI une valeur par défaut? Tels que CommandLine.getOptionValue() ou l'appel de fonction mentionné ci-dessus renvoient cette valeur sauf si une est spécifiée sur la ligne de commande

37
aib

EDIT: les valeurs par défaut sont désormais prises en charge. Voir la réponse https://stackoverflow.com/a/14309108/1082541 ci-dessous.

Comme Brent Worden l'a déjà mentionné, les valeurs par défaut ne sont pas prises en charge.

J'ai eu des problèmes avec l'utilisation de Option.setType aussi. J'ai toujours eu une exception de pointeur nul lors de l'appel de getParsedOptionValue sur une option de type Integer.class. Parce que la documentation n'était pas vraiment utile, j'ai regardé le code source.

En regardant la classe TypeHandler et la classe PatternOptionBuilder , vous pouvez voir que Number.class doit être utilisé pour int ou Integer.

Et voici un exemple simple:

CommandLineParser cmdLineParser = new PosixParser();

Options options = new Options();
options.addOption(OptionBuilder.withLongOpt("integer-option")
                      .withDescription("description")
                      .withType(Number.class)
                      .hasArg()
                      .withArgName("argname")
                      .create());

try {
    CommandLine cmdLine = cmdLineParser.parse(options, args);

    int value = 0; // initialize to some meaningful default value
    if (cmdLine.hasOption("integer-option")) {
        value = ((Number)cmdLine.getParsedOptionValue("integer-option")).intValue();
    }

    System.out.println(value);
} catch (ParseException e) {
    e.printStackTrace();
}

Gardez à l'esprit que value peut déborder si un nombre est fourni qui ne rentre pas dans un int.

48
Patrick Spettel

Je ne sais pas si cela ne fonctionne pas ou s'il a été ajouté récemment mais getOptionValue () has une version surchargée qui accepte une valeur par défaut (chaîne)

27
Mr_and_Mrs_D

L'OptionBuilder est déconseillé dans les versions 1.3 & 1.4 et Option.Builder ne semble pas avoir de fonction directe pour définir le type. Il existe une fonction pour la classe Option appelée setType. Vous pouvez récupérer une valeur convertie avec la fonction CommandLine.getParsedOptionValue. Je ne sais pas pourquoi il ne fait plus partie du constructeur. Il nécessite maintenant du code comme celui-ci:

    options = new Options();

    Option minOpt = Option.builder("min").hasArg().build();
    minOpt.setType(Number.class);
    options.addOption(minOpt);

et en le lisant:

    String testInput = "-min 14";
    String[] splitInput = testInput.split("\\s+");

    CommandLine cmd =  CLparser.parse(options, splitInput);
    System.out.println(cmd.getParsedOptionValue("min")); 

ce qui donnerait une variable de type Long

2
ramin

CLI ne prend pas en charge les valeurs par défaut. Toute option non définie se traduit par getOptionValue renvoyant null.

Vous pouvez spécifier des types d'options à l'aide de la méthode Option.setType et extraire la valeur d'option analysée comme ce type à l'aide de CommandLine.getParsedOptionValue

1
Brent Worden

On peut utiliser une autre définition de

getOptionValue:
public String getOptionValue(String opt, String defaultValue)

et enveloppez votre valeur par défaut dans une chaîne.

Exemple:

String checkbox = line.getOptionValue("cb", String.valueOf(false));

sortie: faux

ça a marché pour moi

0
Dhaval Aarya