parse org example commons cli java apache-commons apache-commons-cli

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 .