25

Sto scrivendo un'applicazione da riga di comando in Java e ho scelto Apache Commons CLI per analizzare gli argomenti di input.Commons Gruppi richiesti CLI

Diciamo che ho due opzioni richieste (es. -informazioni e -output). Creo un nuovo oggetto Option e imposta il flag richiesto. Per ora va tutto bene. Ma ho terzo, opzione non richiesta, vale a dire. -Aiuto. Con le impostazioni che ho menzionato, quando l'utente vuole mostrare aiuto (usa l'opzione -help) dice "-input e -output" sono obbligatori. C'è un modo per implementarlo (tramite l'API CLI di Commons, non semplice se (! HasOption) lanciare la nuova XXXException()).

risposta

27

In questa situazione è necessario definire due set di opzioni e analizzare la riga di comando due volte. Il primo set di opzioni contiene le opzioni che precedono il gruppo richiesto (in genere --help e --version) e il secondo set contiene tutte le opzioni.

Si inizia analizzando il primo set di opzioni e se non viene trovata alcuna corrispondenza, si procede con il secondo set.

Ecco un esempio:

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. Ma come posso dire che non ho trovato la partita? ("e se non viene trovata alcuna corrispondenza")? Se imposto la flag richiesta ottengo ParseExeception, ma quando passo l'opzione che non è disponibile ricevo anche ParseException :(Come posso differenziare questi casi? – pavel

+0

Sai se hai una corrispondenza quando 'commandline.getOptions()' isn ' t vuoto –

+0

Ok. È possibile una soluzione, ma per quanto riguarda la gestione delle opzioni non supportate? Le opzioni disponibili sono -help, -input, -output. L'utente pone -test. Quindi devo controllare il primo set (con HELP) per determinare se l'aiuto è stato trovato o no, se è stata lanciata l'opzione UnrecognizedOptionException, ho bisogno di analizzare il secondo set di opzioni? Quindi prova semplicemente {parsefirstSet() if (not_found) parseSecondSet() catch (ParserException) {parseSecondSet()}? Mi manca qualcosa o è quello che hai suggerito. Grazie per l'aiuto btw :) – pavel

Problemi correlati