У меня есть программа, которая выполняет различные виды статистического анализа. Я хотел бы определить подкоманду для каждого типа анализа. Родительская команда будет главной точкой входа в программу. Я получаю сообщение об ошибке, в котором говорится, что «опция должна быть указана только один раз», когда мои подкоманды имеют опции с одинаковым именем. Кажется, проблема в том, как я называю подкоманды. В приведенном ниже примере input1 и input2 работают правильно. Когда я пытаюсь использовать обе подкоманды одновременно (input3), я получаю сообщение об ошибке.
Код ниже демонстрирует проблему. Если вход содержит обе подкоманды (то есть input3), я получаю сообщение об ошибке "option '-id' в index 0 () должен быть указан только один раз".
Как я могу вызвать обе подкоманды одновременно, как в input3?
import picocli.CommandLine;
import java.util.concurrent.Callable;
@CommandLine.Command(name = "myprogram", subcommands = {TestCase.FrequencyCommand.class, TestCase.HistogramCommand.class})
public class TestCase implements Callable<Void> {
public TestCase(){
}
public Void call() {
System.out.println("Main program called");
return null;
}
public static void main(String[] args){
String[] input1 = {"frequency", "-id", "1001", "-table", "ex1"};
String[] input2 = {"histogram", "-id", "1002", "-table", "ex5" };
String[] input3 = {"frequency", "-id", "1001", "-table", "ex1", "histogram", "-id", "1002", "-table", "ex5" };
CommandLine commandLine = new CommandLine(new TestCase());
System.out.println("==Test1==");
commandLine.execute(input1);
System.out.println();
System.out.println("==Test2==");
commandLine.execute(input2);
System.out.println();
System.out.println("==Test3==");
commandLine.execute(input3);
System.out.println();
}
@CommandLine.Command(name = "frequency", description = "Frequency analysis.")
static class FrequencyCommand implements Callable<Void> {
@CommandLine.Option(names = {"-id"}, arity = "1..*", description = "Unique case identifier")
public String id;
@CommandLine.Option(names = "-table", arity = "1..*", description = "Database table")
public String table;
public FrequencyCommand(){
}
public Void call() {
System.out.println("Frequency");
System.out.println("ID = " + id);
System.out.println("Table = " + table);
return null;
}
}
@CommandLine.Command(name = "histogram", description = "Histogram plot.")
static class HistogramCommand implements Callable<Void> {
@CommandLine.Option(names = {"-id"}, arity = "1..*", description = "Unique case identifier")
public String id;
@CommandLine.Option(names = "-table", arity = "1..*", description = "Database table")
public String table;
public HistogramCommand(){
}
public Void call() {
System.out.println("Histogram");
System.out.println("ID = " + id);
System.out.println("Table = " + table);
return null;
}
}
}
Результат, который я ожидаю увидеть:
== Test1 ==
Частота
ID = 1001
Таблица = ex1
== Test2 ==
Гистограмма
ID = 1002
Таблица = ex5
== Test3 ==
Частота
ID = 1001
Таблица = ex1
Гистограмма
ID = 1002
Таблица = ex5