Estoy escribiendo un shell en Java porque no he programado en Java durante demasiado tiempo y lo he olvidado mucho. Iba a escribir el mío propio, pero en este momento me gustaría obtener un prototipo que funcione, por lo que me gustaría incluir un analizador de opciones de línea de comandos existente.
Requisitos:
String
Toma un o arbitrario String[]
(es decir, no usa los argumentos de la línea de comando)getopt
(la versión mejorada de GNU); específicamente:
-a -b -c
a -abc
)--message="Hello!"
) (aunque no tiene que admitir opciones largas de un solo guión)-abc --long="Hello!" param1 param2
, me dice que los parámetros son param1
y param2
)--
se puede usar para separar las opciones de los argumentos (por ejemplo -ab --custom="hello" -- -file_starting_with_hyphen -another
, me da las opciones/indicadores a
, b
y custom
con los valores apropiados, y me dice que los argumentos son -file_starting_with_hyphen
y -another
)-h foo
, dice que hay una opción h
, con un valor, foo
)String
o String[]
y me dice qué banderas/opciones se configuraron, en lugar de buscar las opciones que quiero configurar y asumir que el resto son argumentos )
Ideal, pero no necesario:
java.util.Map
, específicamente) para devolver datos. (Esto es para poder escribir mi propia función más fácilmente más adelante)Puedes revisar FeSimpleArgs
Creo que cumple con todos tus requisitos:
Concepto: un analizador de línea de comandos muy ligero. Toma argumentos en forma de cadena o cadena [], devuelve una instancia de clase que contiene los argumentos en un mapa y los parámetros en una lista.
Requisitos:
Un nombre de opción seguido de un valor se analiza como la opción que tiene ese valor (por ejemplo, -h foo dice que hay una opción, h, con un valor, foo) Sí
Totalmente multiplataforma Sí
en cuanto al uso:
Publicado bajo licencia Apache 2.0.
Ideal, pero no necesario:
USO Uso: 1) Construya una instancia de FeSimpleArgs
FeSimpleArgs parser = new FeSimpleArgs();
2) Úselo para analizar sus argumentos:
FeSimpleArgs.Result result = parser.parse ("-def=value1 --GHI=value2 -a -b -c=value3 -n=\"foo bar baz\" -- param1 -param2");
3) Examine sus resultados: De lo anterior, el resultado consistirá en un Mapa que contiene los siguientes argumentos y banderas (tenga en cuenta que no hay un significado real para "argumento" o "bandera", solo estoy usando esos términos para separar si toman valores o no - todos están en el mismo Mapa).
Y una lista que contiene estos parámetros (tenga en cuenta que se conserva el guión inicial) - param1 - -param2
4) ¿Beneficio?
Para ver otros ejemplos, consulte las pruebas unitarias incluidas.
Descargo de responsabilidad: soy el autor de FeSimpleArgs
compile
, Pattern
que nunca cambian, que tokenize2
nunca se usan, etc. Es posible que desee publicar una pregunta en CodeReview.SE .He usado args4j con éxito en varios proyectos. Fue desarrollado por Kohsuke Kawaguchi , quien también desarrolló Jenkins, fue el desarrollador principal de JAXB y otros proyectos, por lo que tiene un muy buen pedigrí.
String[]
y recuperar (por ejemplo) una Map
de opciones, no algo que analice y asigne automáticamente las opciones de los argumentos dados al archivo jar. . Además, tiene que poder decirme qué opciones se han pasado con qué argumentos, en lugar de que yo le diga qué opciones buscar.Nota: esta respuesta está desactualizada, porque OP editó la pregunta para agregar un requisito que esto no cumple (sin embargo, todavía es muy bueno saberlo). Vea los comentarios a continuación. El OP NO quiere que vote negativamente esta respuesta.
El clásico para esto en Unix/Linux, desde los días de C, era GetOpt().
Gnome tiene un puerto Java aquí .
String
y una enumeración. , o un Predicate<T>
, o algo así.picoclí puede ser de su interés. Es un archivo de origen único para animar a los autores de aplicaciones de línea de comandos a incluirlo como fuente como una alternativa más sencilla a sombrear jars en un uberjar. También cumple con todos los demás requisitos establecidos en OP - ACTUALIZACIÓN: excepto por el requisito de que las opciones no se pueden corregir en tiempo de compilación :-(.
ACTUALIZACIÓN 2: picocli 3.x ofrece una API programática además de la API de anotaciones, por lo que ahora cumple con todos los requisitos. Tenga en cuenta que Groovy CliBuilder se basa en picocli desde Groovy 2.5. Esto es exactamente lo que pide el OP: agregar dinámicamente opciones y parámetros posicionales a un comando.
Recientemente agregó la funcionalidad de autocompletar.
Otra característica que te puede gustar es su ayuda de uso coloreada.
Características del analizador:
<command> -xvfInputFile
así como <command> -x -v -f InputFile
) y opciones largas de GNU"1..*"
,"3..5"
El mensaje de ayuda de uso es fácil de personalizar con anotaciones (sin programación). Por ejemplo:
( fuente )
No pude resistir agregar una captura de pantalla más para mostrar qué mensajes de ayuda de uso son posibles. La ayuda de uso es la cara de su aplicación, ¡así que sea creativo y diviértase!
Descargo de responsabilidad: creé picocli. Comentarios o preguntas muy bienvenidos.
un caballo sin nombre
nico
CPerkins
works like getopt
" es su segundo requisito.nico
CPerkins
nico
-n "foo bar baz"
se procesaría como el indicadorn
con parámetrofoo bar baz
, en lugar den
con parámetro"foo
y dos argumentos,bar
ybaz"
.nico
CPerkins
-n foo bar baz
? Con las comillas, lo que quieres es claro. Supongo que estoy preguntando si los espacios en blanco son siempre un separador.nico
CPerkins