2011-04-07 12 views
34

¿Cómo puedo dar un tipo de CLI Option - como int o Integer? (Más tarde, ¿cómo puedo obtener el valor analizado con una sola llamada a la función?)CLI de Apache Commons: tipo de opción y valor predeterminado

¿Cómo puedo dar a la opción CLI un valor predeterminado? Tal que CommandLine.getOptionValue() o la llamada a la función mencionada anteriormente devuelven ese valor a menos que se especifique uno en la línea de comando?

Respuesta

43

EDIT: Los valores por defecto son ahora soportados. Ver la respuesta https://stackoverflow.com/a/14309108/1082541 a continuación.

Según Brent Worden ya mencionado, los valores predeterminados no son compatibles.

Tuve problemas con el uso de Option.setType también. Siempre recibí una excepción de puntero nulo al llamar al getParsedOptionValue en una opción con el tipo Integer.class. Debido a que la documentación no fue realmente útil, investigué el código fuente.

En cuanto a la clase y la clase TypeHandlerPatternOptionBuilder se puede ver que Number.class debe ser utilizado para int o Integer.

Y aquí es un ejemplo sencillo:

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(); 
} 

Tenga en cuenta que value puede desbordarse si se proporciona un número que no encaja en un int.

+8

Gracias por el ejemplo, esto es lo que necesitaba. Sin embargo, he decidido en contra de CLI: es demasiado trabajo. Tal vez sea solo yo, pero me resulta contraproducente cuando tienes que manejar casos comunes como ese. Con suficiente código de configuración, debería ser capaz de decir 'int foo = getOption (" foo ")' y tenerlo por defecto a 42 si algo sale mal. – aib

+1

Sí, tienes razón.También creo que la biblioteca debería manejar esto. ¿Qué biblioteca de análisis de opciones puede recomendar en su lugar? –

+0

Soy nuevo en el mundo de Java. Este fue el primero que probé, y no conozco a otros. Tal vez deberías publicar esto como una pregunta? – aib

1

CLI no es compatible con los valores predeterminados. Cualquier opción no configurada da como resultado getOptionValue que devuelve null.

Puede especificar los tipos de opción utilizando el método Option.setType y extraer el valor de la opción se analiza como ese tipo utilizando CommandLine.getParsedOptionValue

+0

Soy consciente de la existencia de setType() y getParsedOptionValue(), pero no tengo idea de cómo usarlos. ¿Podría darme un pequeño ejemplo? – aib

23

No sé si no funciona o si se añade recientemente, pero getOptionValue()tiene una versión sobrecargada que acepta un valor predeterminado (String) Valor

+0

Esto es precisamente lo que necesitaba hace 2 años :) – aib

+0

@aib: Me alegro de que haya ayudado, ¿existía entonces? –

+0

Supongo que no, de lo contrario lo habría visto. (O alguien más aquí, al menos). – aib

1

El OptionBuilder está en desuso en la versión 1.3 & 1.4 y Option.Builder doesn' Parece que tiene una función directa para establecer el tipo. Hay una función para la clase Option llamada setType. Puede recuperar un valor convertido con la función CommandLine.getParsedOptionValue. No estoy seguro de por qué ya no forma parte del generador. Se requiere un poco de código como este ahora:

options = new Options(); 

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

y leerlo:

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

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

lo que daría una variable de tipo Long

Cuestiones relacionadas