2011-11-10 22 views
6

W args4j zdefiniować opcje tak:args4j: w "użytkowaniu" sposób ręcznego sortowania opcji?

@Option(name="-host",usage="host to connect") 
@Option(name="-port",usage="port of the host") 
@Option(name="-idle",usage="idle") 

Jednak po wyświetleniu args4j pomoc zawsze używa kolejności alfabetycznej tak drukuje

-host - host to connect 
-idle - idle 
-port - port to connect 

To nie jest dogodny, ponieważ chcę, aby wyświetlić obowiązkowe opcje pierwszy. Również chcę ustawić kolejność opcji, ponieważ niektóre opcje (takie jak host i port) powinny iść w parze.

Jak kontrolować kolejność opcji w args4j?

Znalazłem to samo pytanie zadane 3 lata temu, ale nie odpowiedział http://markmail.org/message/xce6vitw6miywtos

Odpowiedz

2

Nie można z obecnym Args4j (przynajmniej według mojej wiedzy) - ale ponieważ jest to open source Chciałbym zachęcić do wdrożenia sam i spróbuj uzyskać łatkę w źródle dla nowszych wersji.

Od źródła: org.kohsuke.args4j.CmdLineParser:

// for display purposes, we like the arguments in argument order, but the options in alphabetical order 
    Collections.sort(options, new Comparator<OptionHandler>() { 
     public int compare(OptionHandler o1, OptionHandler o2) { 
      return o1.option.toString().compareTo(o2.option.toString()); 
     } 
    }); 
+0

Obecnie jestem zajęta zupełnie innymi projektami (nawet Java), ale byłoby miło, gdyby ktoś inny mógł to zrobić :) – javapowered

0

Ten problem nadal nie jest rozwiązany po upływie 3 lat. Ale istnieje obejście.

Ponieważ CmdLineParser używa listy do zapisania opcji, a lista jest wyświetlana przez getOptions(), możesz uzyskać listę i posortować ją samodzielnie. Ponieważ lista jest sortowana tylko w konstruktorze. Możesz go posortować w dowolnym momencie po zbudowaniu CmdLineParser. Następnie zamawiane jest wyjście printUsage().

To obejście zależy od implementacji CmdLineParser, więc nie jest dobrym przykładem do naśladowania. Ale jako obejście działa, przynajmniej w obecnej wersji (2.0.28).

5

Możesz ustawić sortowanie za pomocą właściwości ParserProperties, a następnie użyć tego w konstruktorze CmdLineParser. Jeśli ustawisz OptionSorter null, kolejność opcji zostaną zachowane:

ParserProperties properties = ParserProperties.defaults(); 
properties.withOptionSorter(null); 
CmdLineParser parser = new CmdLineParser(YOUR_OPTIONS_CLASS, properties); 

Więc w przykładzie na pytanie będzie można uzyskać:

-host - host to connect 
-port - port to connect 
-idle - idle 
Powiązane problemy