2011-05-18 9 views
17

Estoy escribiendo una aplicación Java que toma argumentos de la línea de comandos que se procesan utilizando Apache Commons CLI con GnuParser. Por razones que no son interesantes, me gustaría ignorar silenciosamente las opciones de línea de comando desconocidas en lugar de lanzar una ParseException, pero no veo una manera de hacerlo. Veo que hay una opción booleana stopAtNonOption en GnuParser.parse() pero lo que quiero es más como ignoreAtNonOption, donde se seguirán procesando las opciones después de encontrar un token desconocido.¿Puede el analizador de opciones de la CLI de Apache Commons ignorar opciones de línea de comando desconocidas?

Podría implementar mi propio analizador para lograr esto, pero me sorprende que no haya esta funcionalidad incorporada, así que pensé en verificar antes de seguir por ese camino.

Código de ejemplo para lo que estoy hablando:

try { 
    CommandLine commandLine = parser.parse(options, args); 
    // stopAtNonOption set to true (below) is also not what I want 
    // CommandLine commandLine = parser.parse(options, args, true); 
} catch (ParseException e) { 
    LOG.error("error parsing arguments", e); 
    throw new RuntimeException(e); 
} 

Respuesta

25

Esto funciona para mí (otros programas de análisis puede se deriva, también):

public class ExtendedGnuParser extends GnuParser { 

    private boolean ignoreUnrecognizedOption; 

    public ExtendedGnuParser(final boolean ignoreUnrecognizedOption) { 
     this.ignoreUnrecognizedOption = ignoreUnrecognizedOption; 
    } 

    @Override 
    protected void processOption(final String arg, final ListIterator iter) throws  ParseException { 
     boolean hasOption = getOptions().hasOption(arg); 

     if (hasOption || !ignoreUnrecognizedOption) { 
      super.processOption(arg, iter); 
     } 
    } 

} 
+8

Eso es hermoso, gracias! Por cierto, esto debería ser una nota para los diseñadores de API sobre por qué definitivamente no quieres que tus clases de API sean definitivas. ¿Por qué? Porque no eres lo suficientemente inteligente como para descubrir todas las formas en que el código del cliente quisiera reutilizar tus cosas. –

+0

He hecho lo mismo para BasicParser. ¡Trabajado como un encanto!. Definitivamente debería ser agregado a la API cli. – Dudi

+1

Esto ahora está en desuso :(. – Decoded

0

Esto no es posible con los Comunes CLI. Pero puede haber otra forma de lograr el resultado que espera si proporciona más detalles de su caso de uso.

0

soy una muy mala desarrollador, y hago esto para romper el código:

public class EasyPosixParser extends PosixParser { 
    @Override 
    protected void processOption(String arg, ListIterator iter) throws ParseException 
    { 
     try { 
      super.processOption(arg, iter); 
     } catch (ParseException e) { 
      // do nothing 
     } 
    } 
} 

en el código principal, trata de:

CommandLineParser commandlineParser = new EasyPosixParser(); 
Cuestiones relacionadas