2012-02-16 21 views
7

chcę coś takiego:Jak określić wiele opcji przy użyciu cache apache commons?

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

Z treści:

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); 

... gdzie wyjście jest:

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

Spodziewam dla -job1 powinien wydrukować -job1 -C <> -W <>

Czy czegoś brakuje? Nie działa z więcej niż jednym argumentem. Przy okazji użyłem commons-cli 1.2.

+1

myślę, że jesteś nieporozumienie 'hasArgs()' i 'withArgName()'. –

+0

Wygląda na to, że nie można tego zrobić za pomocą apache-commons-cli - biblioteki apache, która robi bardzo mało. Spodziewałem się więcej. Spróbuję i zobaczę, jak mogę dodać więcej funkcji ... –

Odpowiedz

7

Nie można mieć argumentów kontekstowych. Możesz mieć argumenty: job1, job2, job3, C & W, ale nie możesz powiedzieć (za pośrednictwem biblioteki), że C & W są ważne tylko dla zadania 1.

Jeśli zadania 1/2/3 wzajemnie się wykluczają, utwórz grupę OptionGroup. Następnie w kodzie upewnij się, że C & W są podane tylko dla zadania 1.

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); 
     } 
    } 
} 

która produkuje następujące dane wyjściowe:

<~/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

Sposób, w jaki stworzyłeś 'job1', nie jest nawet kompilacją, mam do czynienia z wersją 1.2 dla zależności, jak to zrobiłeś? – daydreamer

+0

Jaki błąd widzisz? –

+0

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

Powiązane problemy