java - example - org apache commons cli
CLI de Apache Commons: tipo de opciĆ³n y valor predeterminado (4)
CLI no admite valores predeterminados. Cualquier opción no configurada da como resultado que getOptionValue
devuelva null
.
Puede especificar tipos de opciones utilizando el método Option.setType y extraer el valor de la opción analizada como ese tipo usando CommandLine.getParsedOptionValue
¿Cómo puedo dar un tipo a una CLI Option, como int
o Integer
? (Más tarde, ¿cómo puedo obtener el valor analizado con una sola llamada de función?)
¿Cómo puedo dar a una CLI Option 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?
No sé si no funciona o si se agregó recientemente, pero getOptionValue() tiene una versión sobrecargada que acepta un valor predeterminado (cadena)
OptionBuilder está en desuso en la versión 1.3 y 1.4 y Option.Builder
no parece tener una función directa para establecer el tipo. Hay una función para la clase de 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. Requiere un código como este ahora:
options = new Options();
Option minOpt = Option.builder("min").hasArg().build();
minOpt.setType(Number.class);
options.addOption(minOpt);
y leyéndolo
String testInput = "-min 14";
String[] splitInput = testInput.split("//s+");
CommandLine cmd = CLparser.parse(options, splitInput);
System.out.println(cmd.getParsedOptionValue("min"));
que daría una variable de tipo Long
EDITAR: ahora se admiten los valores predeterminados. Consulte la respuesta https://.com/a/14309108/1082541 continuación.
Como ya mencionó Brent Worden, los valores predeterminados no son compatibles.
Tuve problemas con el uso de Option.setType
también. Siempre getParsedOptionValue
una excepción de puntero nulo al llamar a getParsedOptionValue
en una opción con tipo Integer.class
. Debido a que la documentación no fue realmente útil, investigué el código fuente.
Al TypeHandler clase TypeHandler y la clase PatternOptionBuilder , puede ver que Number.class
debe usar para int
o Integer
.
Y aquí hay un ejemplo 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();
}
Tenga en cuenta que el value
puede desbordarse si se proporciona un número que no se ajusta a un int
.