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.
- picocli (2017) tiene ayuda de uso con colores ANSI y autocompletar
- JArgs
- Jakarta Commons CLI
- TE-Code (tiene una biblioteca de análisis de línea de comandos).
- argparser
- Puerto de Java de GNU getopt
- Args4J
- JSAP
- JOpt Simple
- CLAJR
- CmdLn
- JewelCli
- JCommando
- parse-cmd
- JCommander
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:
JSAP se ve bastante bien para mí.
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 hay un java getopt http://www.urbanophile.com/arenn/hacking/download.html
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).