una tutorial sistema programa libreria fuente codigo biblioteca java command-line jar command-line-interface

tutorial - sistema de libreria en java



¿Biblioteca Java para analizar los parámetros de línea de comandos? (10)

Aquí hay una lista de bibliotecas relativamente actualizadas (A partir de agosto de 2017) que responden a su pregunta.

Si buscas una recomendación, te recomiendo JOpt Simple o JewelCli.

Escribo una pequeña aplicación de línea de comandos en Java. Esta aplicación debería funcionar con una combinación de parámetros y comandos, similar a svn .


Ejemplos

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


Querido

  • Existe una biblioteca fácil de usar para Java
  • Admite el análisis de tales líneas de comando
  • (Bonificación) crea automáticamente una ayuda apropiada

Estoy usando airlift para un proyecto en el que estoy trabajando, parece funcionar muy bien:

https://github.com/airlift/airline

Dependencia simple de Maven que debe agregar:

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

Y después de eso está basado en anotaciones y tiene una forma bastante clara de mostrar texto de ayuda también.

Puede ver un ejemplo aquí si es útil:

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



JewelCLI es una biblioteca de Java para el análisis de línea de comandos que produce código limpio . Utiliza las interfaces proxy configuradas con anotaciones para construir dinámicamente una API segura para sus parámetros de línea de comandos.

Una interfaz de parámetro de ejemplo Person.java :

import uk.co.flamingpenguin.jewel.cli.Option; public interface Person { @Option String getName(); @Option int getTimes(); }

Un ejemplo de uso de la interfaz de parámetros 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()); } } }

Guarde las copias de los archivos anteriores en un solo directorio y descargue el JAR JewelCLI 0.7.6 a ese directorio también.

Compila y ejecuta el ejemplo en Bash en 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

Compile y ejecute el ejemplo en el símbolo del sistema de 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

Ejecutar el ejemplo debería producir el siguiente resultado:

Hello John Doe Hello John Doe Hello John Doe


Para completar, agreguemos 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; }

y un ejemplo de uso

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


Soy un fan de Commons CLI .

Puede configurarlo para que comprenda los comandos, los indicadores (con nombres cortos y largos), si se requieren ciertos comandos / conmutadores o si tienen valores predeterminados. Incluso tiene la funcionalidad para imprimir un mensaje de --help útil.

La página Escenarios de uso tiene algunos buenos ejemplos de cómo se puede usar.



También vale la pena mirar --jopt-simple .

Intenta respetar las sintaxis de la opción de línea de comando de POSIX getopt () y GNU getopt_long (). '' Parece tener cierta tracción de la comunidad, notablemente es la línea de comando que analiza la lib de elección para OpenJDK (y Minecraft!).


Commandline está basado en anotaciones, permite reglas complejas para combinar argumentos (secuencias, anidamiento, argumentos, tipos, ...) y está razonablemente bien documentado.

Para usarlo, agrega

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

a tu pom, y declara las opciones disponibles de la siguiente manera:

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 }

y luego analizar realmente la línea de comando, hacer

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 ... } }

tenga en cuenta que aún no contiene un texto de ayuda generado automáticamente. Esto fue prototipo, pero abortado. Es fácil generar un texto de ayuda básico para casos simples, pero para configuraciones más complejas (por ejemplo, las opciones disponibles para una aplicación como "buscar" o "gcc"), el resultado no será bonito, y es probable que prefiera controla el diseño tú mismo.


Pruebe args4j : http://args4j.kohsuke.org

Prefiero args4j a Commons CLI. (Y he usado ambos)

Con args4j , no necesita llamar a ninguna función. ¡Todo está hecho para ti! (Los parámetros están configurados para campos de objeto a través de la reflexión).