- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用以下格式用 picocli 解析选项:
application -mode CLIENT -c aaaa -d bbbb
application -mode SERVER -e xxxx -f yyyy
mode
是一个 enum
,其值为 { CLIENT, SERVER }
mode == CLIENT
,-c
和-d
选项是必须的,而-e
,不得使用 -f
。mode == SERVER
,-e
和-f
选项是必须的,而-c
,不得使用 -d
。换句话说,我想根据一个关键选项来选择所需的选项。这在 picocli 中可能吗?
最佳答案
是的,这是可能的。一种方法是简单的编程验证:
import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Model.CommandSpec;
import picocli.CommandLine.Option;
import picocli.CommandLine.ParameterException;
import picocli.CommandLine.Spec;
import java.util.Objects;
import java.util.function.Predicate;
@Command(name = "application", mixinStandardHelpOptions = true)
public class MyApp implements Runnable {
enum Mode {CLIENT, SERVER}
@Option(names = "-mode", required = true)
Mode mode;
@Option(names = "-c") String c;
@Option(names = "-d") String d;
@Option(names = "-e") String e;
@Option(names = "-f") String f;
@Spec CommandSpec spec;
public static void main(String[] args) {
System.exit(new CommandLine(new MyApp()).execute(args));
}
@Override
public void run() {
validateInput();
// business logic here...
}
private void validateInput() {
String INVALID = "Error: option(s) %s cannot be used in %s mode";
String REQUIRED = "Error: option(s) %s are required in %s mode";
if (mode == Mode.CLIENT) {
check(INVALID, "CLIENT", Objects::isNull, e, "-e", f, "-f");
check(REQUIRED, "CLIENT", Objects::nonNull, c, "-c", d, "-d");
} else if (mode == Mode.SERVER) {
check(INVALID, "SERVER", Objects::isNull, c, "-c", d, "-d");
check(REQUIRED, "SERVER", Objects::nonNull, e, "-e", f, "-f");
}
}
private void check(String msg, String param, Predicate<String> validator, String... valuesAndLabels) {
String desc = "";
String sep = "";
for (int i = 0; i < valuesAndLabels.length; i += 2) {
if (validator.test(valuesAndLabels[i])) {
desc = sep + valuesAndLabels[i + 1];
sep = ", ";
}
}
if (desc.length() > 0) {
throw new ParameterException(spec.commandLine(), String.format(msg, desc, param));
}
}
}
或者,如果您愿意稍微更改您的要求,我们可以使用 picocli 的 argument groups对于更具声明性的方法:
import picocli.CommandLine;
import picocli.CommandLine.ArgGroup;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;
@Command(name = "application", mixinStandardHelpOptions = true)
public class MyApp2 implements Runnable {
static class ClientArgs {
@Option(names = "-clientMode", required = true) boolean clientMode;
@Option(names = "-c", required = true) String c;
@Option(names = "-d", required = true) String d;
}
static class ServerArgs {
@Option(names = "-serverMode", required = true) boolean serverMode;
@Option(names = "-e", required = true) String e;
@Option(names = "-f", required = true) String f;
}
static class Args {
@ArgGroup(exclusive = false, multiplicity = "1", heading = "CLIENT mode args%n")
ClientArgs clientArgs;
@ArgGroup(exclusive = false, multiplicity = "1", heading = "SERVER mode args%n")
ServerArgs serverArgs;
}
@ArgGroup(exclusive = true, multiplicity = "1")
Args args;
public static void main(String[] args) {
System.exit(new CommandLine(new MyApp2()).execute(args));
}
@Override
public void run() {
// business logic here...
}
}
当仅使用 -serverMode
调用时,第二个示例将显示此错误消息,后跟使用帮助消息:
Error: Missing required argument(s): -e=<e>, -f=<f>
Usage: application ((-clientMode -c=<c> -d=<d>) | (-serverMode -e=<e> -f=<f>))
...
请注意,这种声明式方法无法通过单个 -mode
选项实现:每个参数组都需要自己的选项(我选择了 -clientMode
和 -serverMode
在这个例子中)。这允许 picocli 解析器找出哪些选项必须一起出现,哪些选项是相互排斥的。
关于java - Picocli 需要基于主要选项的选项选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61665865/
我有一个带有使用 picocli 3.9.6 的内部命令行的库。这些命令之一是 log命令,它的工作方式与大多数记录器一样,采用日志级别和消息,以及其他几个选项。它在一些使用该库的应用程序中被多次调用
我想用以下格式用 picocli 解析选项: application -mode CLIENT -c aaaa -d bbbb application -mode SERVER -e xxxx -f
如何支持所有(或部分)命令和子命令的共享选项?例如,如果最终用户在命令行参数中的任何位置提供 --stacktrace,则打印的任何错误都将包含堆栈跟踪。 我们可以使用 Mixin 定义一个 bool
我正在从 picocli 3.9.6 更新到 4.2.0,在用新版本替换旧的已弃用调用时遇到了问题。 在我的原始版本中,我有一个这样的代码块: try { return commandLine
我想为我的程序提供一个搜索字符串,例如: cmd.execute("getDevices", "-h 1.2.3.4", "-p myPSW", "-u myUser", "-n red|blue&b
我一直在尝试一些 C 解释器并发现picoC 看起来可以满足我的所有需求。 启动您调用的脚本void PicocCallMain(int argc, char **argv);它递归地调用内部解析器等
Picocli v2.3.0。 @CommandLine.Option(names = {"--number-headings"}, arity = "0..1
我正在使用 picocli java 命令行库来实现命令行应用程序。但是,我想知道 picocli 是否提供了一种功能,可以帮助处理命令行不接收任何参数或选项(默认情况下)的情况。 谢谢 最佳答案 我
我有一个带有命令行变量的工作项目。当我使用命令行选项在 IntelliJ 中运行它时它可以工作,我如何将它变成一个完整的终端命令? 最佳答案 picocli 用户手册有两个可能相关的部分: Runni
我正在尝试使用 PICOCLI 在 Java 中构建 CLI,但我在一个非常基本的点上陷入困境。我根本无法让我的应用程序向消费者提供一个选项和它的值(value)。这是我的课: package c
我正在使用picocli实现一个 cli 工具,我有一个如下所示的命令。 mainCommand subCommand : parameter3 我的问题是如何映射 parameter和paramet
我尝试实现我自己的 CLI 并想使用 picocli 来解析我的命令的参数。这就是为什么我根本不想让 picocli 在控制台中写入。所以我创建了带有一些选项和参数注释的类 MyCommand。现在我
我有一个带有子命令的命令。在我的应用程序中,我希望用户必须指定一个子命令。我应该怎么做? (另见 https://github.com/remkop/picocli/issues/529) 最佳答案
我有一个用例,我需要以指定的格式发布 CLI 的完整帮助。我找到了一种使用以下方法来做到这一点的方法: @CommandLine.Command(name="myAp", synops
我遇到的情况是,我需要三个强制参数(field1、field2 和 field3。然后我希望用户输入a 命令名称(必填,值可以是create、list等)。命令名称必须输入,并且必须是单数(仅可以输入
我遇到的情况是,我需要三个强制参数(field1、field2 和 field3。然后我希望用户输入a 命令名称(必填,值可以是create、list等)。命令名称必须输入,并且必须是单数(仅可以输入
@Parameters(index = "0") private Double min_c_re; @Parameters(index = "1") private Double min_c_im;
假设我的项目执行大量逻辑,并且有一些入口点,它们是 CLI 命令。 我用@Command注释我的入口点,初始化我的@Parameters和@Option注释字段并执行逻辑,这并不不再需要 CLI。 据
我有这样的选择 @CommandLine.Option(names = "-D", description = "Define a symbol.") /* A list of def
我刚刚偶然发现 picoc它的功能给我留下了深刻的印象——尤其是它可以通过添加新功能等进行扩展这一事实。它使我免于走上尝试“推出自己的”解释器的道路。 但是,我想知道我是否可以通过以下方式扩展 pic
我是一名优秀的程序员,十分优秀!