2009-07-29 20 views
138

Scrivo una piccola applicazione da riga di comando in Java. Questa applicazione dovrebbe funzionare con un mix di parametri e comandi, simile a svn.Libreria Java per l'analisi dei parametri della riga di comando?


Esempi

app url command1 
app url command2 --parameter2 -x 
app url command1 --param-with-argument argument 
app --parameter url command1 
app --no-url command2 
app --help 


Cercasi

  • esiste una libreria facile da usare per Ja va
  • supporta l'analisi di tali righe di comando
  • (Bonus) crea automaticamente un aiuto appropriato
+1

Strettamente legata domanda più vecchio: http://stackoverflow.com/questions/435740/are-there-good-java-libraries-that-facilitate-building-command-line-applications – Jonik

+1

possibile duplicato del [C'è un buon parser argomento riga di comando per Java?] (http://stackoverflow.com/questions/367706/is-there-a-good-command-line-argument-parser-for-java) –

+1

Questa è una buona domanda che merita di essere su http://softwarerecs.stackexchange.com/. –

risposta

82

io sono un fan di Commons CLI.

È possibile impostarlo per comprendere comandi, contrassegni (con nomi brevi e lunghi), se sono richiesti o meno determinati comandi/interruttori o se hanno valori predefiniti. Ha anche funzionalità per stampare un utile messaggio di tipo --help.

La pagina Usage Scenarios ha alcuni buoni esempi di come può essere utilizzata.

+0

Hy. È passato molto tempo, ma non posso ottenere apache cli prendere i miei comandi, solo le bandiere. E non posso trovare un esempio. =/ –

54

Prova args4j:http://args4j.kohsuke.org

preferisco args4j a Commons CLI. (E ho usato entrambi.)

Con args4j, non è necessario chiamare alcuna funzione. Tutto è fatto per te! (I parametri sono impostati su campi oggetto tramite riflessione.)

+10

Usiamo anche args4j. Uno svantaggio è che non è possibile specificare opzioni multivalore nello stile di '-file input1.txt input2.txt'. Devi specificare l'opzione switch prima di ogni valore ('-file input1.txt -file input2.txt') che potrebbe essere uno svantaggio se ti piace usare l'espansione di bash (quindi' -file input * .txt' è ** non ** possibile) – MRalwasser

+2

il progetto si trasferisce a http://args4j.kohsuke.org/ –

+0

opzioni multivalore non sono più supportati a partire dal args4j 2.0.23 ... – ochedru

28

JewelCLI è un Java library for command-line parsing that yields clean code. Utilizza le interfacce Proxied configurate con annotazioni per creare dinamicamente un'API sicura dal tipo per i parametri della riga di comando.

Un'interfaccia esempio parametro Person.java:

import uk.co.flamingpenguin.jewel.cli.Option; 

public interface Person { 
    @Option String getName(); 
    @Option int getTimes(); 
} 

Un esempio d'uso dell'interfaccia di parametri Hello.java:

import static uk.co.flamingpenguin.jewel.cli.CliFactory.parseArguments; 
import uk.co.flamingpenguin.jewel.cli.ArgumentValidationException; 

public class Hello { 
    public static void main(String [] args) { 
     try { 
      Person person = parseArguments(Person.class, args); 
      for (int i = 0; i < person.getTimes(); i++) 
       System.out.println("Hello " + person.getName()); 
     } catch(ArgumentValidationException e) { 
      System.err.println(e.getMessage()); 
     } 
    } 
} 

salvare copie dei file di cui sopra a una singola directory e scaricare il JewelCLI 0.7.6 JAR a quella directory anche.

Compilare ed eseguire l'esempio in Bash su Linux/Mac OS X/etc.:

javac -cp jewelcli-0.7.6.jar:. Person.java Hello.java 
java -cp jewelcli-0.7.6.jar:. Hello --name="John Doe" --times=3 

Compilare ed eseguire l'esempio nel prompt dei comandi di Windows:

javac -cp jewelcli-0.7.6.jar;. Person.java Hello.java 
java -cp jewelcli-0.7.6.jar;. Hello --name="John Doe" --times=3 

eseguire l'esempio dovrebbe produrre il seguente output:

Hello John Doe 
Hello John Doe 
Hello John Doe 
+0

Come si può vedere JewelCLI rende l'analisi della riga di comando semplice e sicura. Non ha nemmeno il bagaglio delle dipendenze da trascinare lungo il quale è una rarità in questi giorni. –

+0

Grazie per la correzione URL @deterb :) –

+0

Grazie per le correzioni del link @flamingpenguin :) –

3

JSAP sembra piuttosto buono per me.

http://sourceforge.net/projects/jsap/

+0

Info: L'ultimo file rilasciato di JSAP era stato nel 2006 – MRalwasser

+0

Potrebbe essere vecchio, ma funziona ancora come un incantesimo per me. Tuttavia, dipendenze complicate come "Se il parametro A è dato, il parametro B deve essere più piccolo di A" non può essere espresso automaticamente. – kap

15

E 'anche la pena di guardare --jopt-simple.

E 'il tentativo di rispettare le sintassi delle opzioni della riga di comando di POSIX getopt() e GNU getopt_long().' Sembra avere una certa trazione della community, in particolare la riga di comando che analizza la lib di scelta per lo OpenJDK (e Minecraft!).

19

Per completezza aggiungiamo JCommander https://github.com/cbeust/jcommander

public class JCommanderTest { 
    @Parameter 
    public List<String> parameters = Lists.newArrayList(); 

    @Parameter(names = { "-log", "-verbose" }, description = "Level of verbosity") 
    public Integer verbose = 1; 

    @Parameter(names = "-groups", description = "Comma-separated list of group names to be run") 
    public String groups; 

    @Parameter(names = "-debug", description = "Debug mode") 
    public boolean debug = false; 
} 

ed un esempio di utilizzo

CommanderTest jct = new JCommanderTest(); 
String[] argv = { "-log", "2", "-groups", "unit", "a", "b", "c" }; 
new JCommander(jct, argv); 

Assert.assertEquals(jct.verbose.intValue(), 2); 
+1

Da http://jcommander.org/: "JCommander: Perché la vita è troppo breve per analizzare i parametri della riga di comando". –

+0

Ho appena provato la libreria di Commons CLI, l'ho trovata estremamente frustrante da usare, passata a JCommander e non ho rimpianti! Qualcosa di semplice come accettare opzioni sconosciute era ridicolmente complicato da ottenere con la CLI di Commons. D'altra parte è un one-liner con JCommander. –

3

sto usando ponte aereo per un progetto su cui sto lavorando, sembra funzionare abbastanza bene:

https://github.com/airlift/airline

semplice Maven Depen denza che è necessario aggiungere:

<dependency> 
    <groupId>io.airlift</groupId> 
    <artifactId>airline</artifactId> 
    <version>0.6</version> 
</dependency> 

E dopo che è annotazioni basata e ha un modo abbastanza pulito di visualizzare il testo della guida pure.

possibile vedere un esempio qui, se è utile:

https://github.com/mneedham/neo4j-web-importer/blob/master/src/main/java/org/neo4j/dataimport/Neo4jImporter.java

+1

Sfortunatamente, questo trascina una dipendenza di 1,8 MB (Guava). La dimensione dell'utilità della riga di comando che sto scrivendo è cresciuta di un fattore 10, solo per supportare le opzioni della riga di comando ... – cambecc

52

Ecco un relativamente aggiornati (come di agosto 2017) elenco delle librerie che rispondere alla tua domanda.

Se siete alla ricerca di una raccomandazione, vi consiglio JOpt Semplice o JewelCli.

+2

JCommander è uno dei più aggiornati in questo elenco. –

+3

Per quanto riguarda il 12 maggio 2015, il JOpt Simple è ancora utilizzato in OpenJDK. Sembra la testimonianza più utile a cui possa pensare. – Ivar

+2

Sì, Ivar, sono d'accordo con te sul fatto che JOpt Simple non è solo semplice da usare, ma completo. JCommander si adatterebbe a quelli con un feticcio per le annotazioni vincolanti. –

4

Commandline basato su annotazioni, consente regole complesse per la combinazione di argomenti (sequenze, annidamento, argomenti, tipi, ...) ed è ragionevolmente ben documentato.

Per usarlo, aggiungere

<dependency> 
    <groupId>com.github.jankroken</groupId> 
    <artifactId>commandline</artifactId> 
    <version>1.7.0</version> 
</dependency> 

al vostro pom, e dichiarare le opzioni disponibili come segue:

public class CommandOptions { 
    private List<String> commands = null; 
    private boolean parameter = false; 
    private boolean url = true; 
    private boolean help = false; 

    @LooseArguments 
    public void setCommands(List<String> commands) { 
    this.commands = commands; 
    } 

    @LongSwitch("parameter") 
    @Toggle(true) 
    public void setParameter(boolean parameter) { 
    this.parameter=parameter; 
    } 

    @LongSwitch("noURL") 
    @Toggle(false) 
    public void setUrl(boolean url) { 
    this.url = url; 
    } 

    @longSwitch("help") 
    @Toggle(true) 
    public void setHelp(boolean help) { 
    this.help = help; 
    } 

    // getters 
} 

e quindi di analizzare in realtà la linea di comando, fare

public final static void main(String[] args) { 
    try { 
    CommandOptions options = CommandLineParser.parse(CommandOptions.class, args, OptionStyle.SIMPLE); 

    // and then you can pass options to your application logic... 

    } catch 
    ... 
    } 
} 

nota che non contiene (ancora) un testo di guida generato automaticamente. Questo è stato prototipato, ma abortito. È facile generare un testo di aiuto di base per casi semplici, ma per configurazioni più complesse (come le opzioni disponibili per un'applicazione come "trova" o "gcc"), il risultato non sarà carino e probabilmente preferirai controlla tu stesso il layout.

Problemi correlati