#picocli
#picocli
Вопрос:
Я хочу иметь взаимоисключающие параметры команд для приведенного ниже фрагмента :
@Command(description = "test command")
public void test(
@Option(names = { "-a"}, required = true, arity = "0", description = "print A") boolean a,
@Option(names = { "-b"}, required = true, description = "pint B") boolean b)
//
}
Если я использую @ArgGroup для поля класса, то это работает, но я хочу добиться того же для методов.
class TestClass{
@ArgGroup(exclusive = true, multiplicity = "1")
private Sample sample = new Sample();
public static class Sample {
@Option(names = { "-a"}, required = true, arity = "0", description = "print A") boolean a ;
@Option(names = { "-b"}, required = true, description = "pint B") boolean b ;
}
}
Ответ №1:
Вы должны иметь возможность использовать @ArgGroup
аннотированный метод, точно так же, как @ArgGroup
аннотированное поле.
Например:
class SomeCommand implements Runnable {
private Sample sample;
@ArgGroup(exclusive = true, multiplicity = "1")
void setGroup(Sample sample) {
System.out.printf("setGroup was called with %s%n", sample);
this.sample = sample;
}
static class Sample {
@Option(names = "-a", required = true, arity = "0", description = "print A") boolean a ;
@Option(names = "-b", required = true, description = "print B") boolean b ;
public String toString() {
return String.format("Sample[a=%s, b=%s]@%x", a, b, hashCode());
}
}
public void run() {
System.out.printf("In run, sample=%s%n", this.sample);
}
public static void main(String... args) {
//System.setProperty("picocli.trace", "DEBUG");
new CommandLine(new SomeCommand()).execute("-a");
}
}
Когда я запускаю это, я вижу следующий вывод:
setGroup was called with Sample[a=false, b=false]@7de62196
In run, sample=Sample[a=true, b=false]@7de62196
Итак, вы можете использовать @ArgGroup
метод -annotated; сначала он будет вызван с новым экземпляром, и этот экземпляр будет изменен после вызова метода setter .
(Мы можем получить больше информации о том, что происходит под капотом, включив трассировку picocli.)