2012-02-16 6 views
7

Quiero algo como:Cómo especificar múltiples opciones usando apache commons cli?

java programName -jobs1 -C 10 -W 20 
java programName -job2 
java programName -job3 

Con contenidos:

Option o1 = new Option("job2", "some desc"); 
Option o2 = new Option("job3" , "(some desc") 

Option o3 = OptionBuilder.hasArgs(2).withArgName("W").withArgName("C").withDescription( "Some desc").create("job1") 
Option o4 = new Option("help"); 

Options os = new Options().addOption(o1).addOption(o2).addOption(o3).addOption(o4). 

HelpFormatter formatter = new HelpFormatter(); 
formatter.printHelp("ProgramName", options); 

... donde la salida es:

Usage ProgramName 
-job1 <c> Some Desc 
-job2  Some desc 
-job3  Some desc 
-help  Print this message 

espero para -job1 se debe imprimir -job1 -C <> -W <>

¿Me estoy perdiendo algo? No funciona con más de un argumento. Por cierto, utilicé commons-cli 1.2.

+1

Creo que estás malentendido 'hasArgs()' y 'withArgName()'. –

+0

Parece que esto no se puede hacer usando apache-commons-cli: una biblioteca apache que hace muy poco. Esperaba más. Trataré de ver cómo puedo agregar más funcionalidades ... –

Respuesta

7

No puede haber argumentos contextuales. Puede tener los argumentos: job1, job2, job3, C & W, pero no puede decir (a través de la biblioteca) que C & W solo son válidos para job1.

Si job1/2/3 son mutuamente excluyentes, cree un OptionGroup. Luego, en el código, asegúrese de que C & W solo se den para job1.

import org.apache.commons.cli.CommandLine; 
import org.apache.commons.cli.CommandLineParser; 
import org.apache.commons.cli.GnuParser; 
import org.apache.commons.cli.Option; 
import org.apache.commons.cli.OptionBuilder; 
import org.apache.commons.cli.OptionGroup; 
import org.apache.commons.cli.Options; 
import org.apache.commons.cli.HelpFormatter; 

public class StackOverflowExample 
{ 
    public static final String JOB1 = "job1"; 
    public static final Option job1 = 
     OptionBuilder.hasArg(false) 
      .isRequired(false) 
      .withDescription("description of job1") 
      .create(JOB1); 

    public static final String JOB2 = "job2"; 
    public static final Option job2 = 
     OptionBuilder.hasArg(false) 
      .isRequired(false) 
      .withDescription("description of job2") 
      .create(JOB2); 

    public static final String JOB3 = "job3"; 
    public static final Option job3 = 
     OptionBuilder.hasArg(false) 
      .isRequired(false) 
      .withDescription("description of job3") 
      .create(JOB3); 

    public static final String MY_C = "C"; 
    public static final Option my_c = 
     OptionBuilder.hasArg(true) 
      .withArgName("count") 
      .isRequired(false) 
      .withDescription("description of C") 
      .create(MY_C); 

    public static final String MY_W = "W"; 
    public static final Option my_w = 
     OptionBuilder.hasArg(true) 
      .withArgName("width") 
      .isRequired(false) 
      .withDescription("description of W") 
      .create(MY_W); 


    public static void main(String[] args) 
    { 
     Options options = new Options(); 

     OptionGroup optgrp = new OptionGroup(); 
     optgrp.addOption(job1); 
     optgrp.addOption(job2); 
     optgrp.addOption(job3); 

     options.addOptionGroup(optgrp); 
     options.addOption(my_c); 
     options.addOption(my_w); 

     try { 
      CommandLineParser parser = new GnuParser(); 
      CommandLine cmdline = parser.parse(options, args); 

      if (((cmdline.hasOption(MY_C)) || (cmdline.hasOption(MY_W))) && 
       (! cmdline.hasOption(JOB1))) { 
       HelpFormatter help = new HelpFormatter(); 
       help.printHelp("cmdname", options); 
       System.exit(-1); 
      } 

      System.out.println("OK"); 
     } 
     catch (Exception ex) { 
      ex.printStackTrace(); 
      System.exit(-1); 
     } 
    } 
} 

que produce el siguiente resultado:

<~/sandbox/CoreUtils/scratch> $ javac -d . -cp ~/sandbox/CoreUtils/lib/commons-cli-1.2.jar:. StackOverflowExample.java 
<~/sandbox/CoreUtils/scratch> $ java -cp ~/sandbox/CoreUtils/lib/commons-cli-1.2.jar:. StackOverflowExample -C foo -job1 
OK 

<~/sandbox/CoreUtils/scratch> $ java -cp ~/sandbox/CoreUtils/lib/commons-cli-1.2.jar:. StackOverflowExample -C foo -job2 
usage: cmdname 
-C <count> description of C 
-job1  description of job1 
-job2  description of job2 
-job3  description of job3 
-W <width> description of W 
+0

La forma en que ha creado 'job1' ni siquiera está compilando, estoy usando maven con la versión 1.2 para la dependencia, ¿cómo lo hizo funcionar? – daydreamer

+0

¿Cuál es el error que está viendo? –

+0

revise este http://stackoverflow.com/questions/12466955/java-apache-cli-optionbuilder-not-working-as-builder-pattern?lq=1 – daydreamer

Cuestiones relacionadas