Похоже, что вы хотите создать множество команд CLI, основываясь просто на их «дескрипторах справки»; DSL сортов.Вместо этого разбора строки, рассмотрите возможность создания команд программно, для которых есть множество библиотек (CLI - только одна) и преимущества.
Ваш пример уже достаточно сложен, чтобы второй взгляд на CLI (или одиниз других) гарантируется.Вы показываете обязательные и необязательные аргументы, у каждого из которых нет ни значения, ни значения по умолчанию (хотя нет средств для указания «обязательных» значений arg без значения по умолчанию, описания команд и т. Д.), И вам все равно нужно создать анализатор для командной строки.сам, проверка, средства вызова обработчиков и т.д ...
Ниже приведен список парсеров команд, которые я нашел.Никто не будет анализировать ваш конкретный DSL, но он позволит вам создавать свои команды программно, анализировать их, часто проверять и предоставлять значимые предупреждения, помогать обрабатывать и т. Д. Некоторые даже используют аннотации на объектах для определения команд, теоретически облегчая обслуживание.
Большинство разработано (и показывают примеры) для анализа аргументов вашей программы, а не для многочисленных команд (исключение - natural-cli), но все должны быть в состоянии сделать это - простой класс может обернуть анализ и параметрывместе:
static class CommandLine {
HashMap<String,Options> options = new HashMap<String,Options>();
public void register(String cmd, Options opts) {
options.put(cmd, opts);
}
public void parse(String line) {
// a better parser here would handle quoted strings
String[] split = line.split("\\s");
String cmd = split[0];
String[] args = new String[split.length-1];
if (args.length > 0)
System.arraycopy(split, 1, args, 0, args.length);
Options opts = options.get(cmd);
if (opts == null)
; // handle unknown command
else {
opts.parse(args);
// handle results...
opts.reset(); // required?
}
}
}
public static void main(String[] args) throws Exception {
CommandLine cl = new CommandLine();
cl.register("size", new Options()); // This will vary based on library Some
cl.register("create-char", new Options()); // require subclasses, others use builder
//... pattern, or other means.
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
while (true) {
cl.parse(in.readLine());
}
}
Другие библиотеки
- CLI
- JewelCli : такжеиспользует аннотации и допускает списки и перечисления для значений.примеры выглядят многообещающе
- natural-cli : разрешает cli с "удобочитаемыми сообщениями".Кажется, что она направлена на достижение нескольких команд и их параметров, включая другой DSL и синтаксис.
- GNU Java Getopt : используется так же, как и выше, хотя вы инициализируете объект Getopt с помощьюимя команды.
- JOpt Simple : утверждает "простота над всеми остальными"
- JArgs
- args4j: использует аннотации к отдельным классам, созданным для каждой команды
- JSAP
- CLAJR : использует отражение
- CmdLn
- ArgParser
- JCommando : использует файлы конфигурации XML.
- parse-cmd : использует построитель-шаблон и цепочку методов для построения параметров
- cli-parser : на основе аннотаций