25

Estoy escribiendo aplicaciones de línea de comandos en Java y he elegido Apache Commons CLI para analizar los argumentos de entrada.CLI Commons requiere grupos

Digamos que tengo dos opciones requeridas (es decir, -input and -output). Creo un nuevo objeto Opción y establezco el indicador requerido. Por ahora todo está bien. Pero tengo en tercer lugar, no se requiere la opción, es decir. -ayuda. Con la configuración que mencioné, cuando el usuario quiere mostrar ayuda (use la opción -ayuda) dice "se requiere -input and -output". ¿Hay alguna forma de implementar esto (a través de la API CLI de Commons, no es simple si (! HasOption) arroja la nueva XXXException()).

Respuesta

27

En esta situación, debe definir dos conjuntos de opciones y analizar la línea de comando dos veces. El primer conjunto de opciones contiene las opciones que preceden al grupo requerido (normalmente --help y --version), y el segundo conjunto contiene todas las opciones.

Comienza analizando el primer conjunto de opciones, y si no se encuentra ninguna coincidencia, continúa con el segundo conjunto.

Aquí se muestra un ejemplo:

Options options1 = new Options(); 
options1.add(OptionsBuilder.withLongOpt("help").create("h")); 
options1.add(OptionsBuilder.withLongOpt("version").create()); 

// this parses the command line but doesn't throw an exception on unknown options 
CommandLine cl = new DefaultParser().parse(options1, args, true); 

if (!cl.getOptions().isEmpty()) { 

    // print the help or the version there. 

} else { 
    OptionGroup group = new OptionGroup(); 
    group.add(OptionsBuilder.withLongOpt("input").hasArg().create("i")); 
    group.add(OptionsBuilder.withLongOpt("output").hasArg().create("o")); 
    group.setRequired(true); 

    Options options2 = new Options(); 
    options2.addOptionGroup(group); 

    // add more options there. 

    try { 
     cl = new DefaultParser().parse(options2, args); 

     // do something useful here. 

    } catch (ParseException e) { 
     // print a meaningful error message here. 
    } 
} 
+0

Ok. ¿Pero cómo puedo decir que no he encontrado el partido? ("y si no se encuentra una coincidencia")? Si configuro el indicador requerido, obtengo la excepción ParseExeception, pero cuando paso la opción que no está disponible obtengo ParseException también :(¿Cómo puedo diferenciar estos casos? – pavel

+0

Sabes si tienes una coincidencia cuando 'commandline.getOptions()' isn ' t vacío. –

+0

Ok. Es posible solución. Pero ¿qué pasa con el manejo de opciones no compatibles? Las opciones disponibles son -ayuda, -input, -output. El usuario pone -test. Luego tengo que verificar el primer conjunto (con HELP) para determinar si la ayuda se encontró o no. Si no, o si se lanzó UnRecognizedOptionException, entonces necesito analizar el segundo conjunto de opciones, así que simplemente pruebe {parsefirstSet() if (not_found) parseSecondSet() catch (ParserException) {parseSecondSet()}? Me falta algo o es lo que sugirió. Gracias por la ayuda :) :) – pavel

Cuestiones relacionadas