Java:Apache commons cli如何处理相互依赖的选项

Java:Apache commons cli如何处理相互依赖的选项,java,apache-commons-cli,Java,Apache Commons Cli,我正在努力使用Apache commons cli v1.3,但尚未找到以下问题的实用解决方案: 我有一个命令行工具,它可以根据指定的参数创建一个字符串(或从本地文件中读取),可以在线编辑它,还可以选择显示、将所述字符串写入本地文件或通过HTTP请求将其发送到服务器 因此,我有选项“c”表示“创建”,“r”表示“读取”,“e”表示“编辑”(通过cli),“d”表示“显示”,“w”表示“写入”,以及“p”表示“推送到服务器” 显然,有些组合是可能的。例如,应该可以创建此字符串并将其推入,而无需从/

我正在努力使用Apache commons cli v1.3,但尚未找到以下问题的实用解决方案:

我有一个命令行工具,它可以根据指定的参数创建一个字符串(或从本地文件中读取),可以在线编辑它,还可以选择显示、将所述字符串写入本地文件或通过HTTP请求将其发送到服务器

因此,我有选项“c”表示“创建”,“r”表示“读取”,“e”表示“编辑”(通过cli),“d”表示“显示”,“w”表示“写入”,以及“p”表示“推送到服务器”

显然,有些组合是可能的。例如,应该可以创建此字符串并将其推入,而无需从/写入文件。此外,它应该可以创建和编写而不推,等等

因此,参数的语义是:

("c" OR ("r" ["e"])) ["d" "w" "p"]
显然,当字符串被“c”创建时,它不能是“r”ead。当“c”创建时,我会使用cli解析器的交互式输入。“r”读取时,我希望允许用户通过cli的交互式输入“e”dit。其余的参数是可选的

下一步:读取“r”时,需要指定文件名/路径。此外,当“w”书写时,这是必要的。无论如何,应该可以指定要读取的文件和要写入的第二个文件。因此,文件名有两个参数,它们都是可选的

生成的语法如下所示:

tool -cp
tool -rp "filenametoread"
tool -rdwp "filenametoread" "filenametowrite"
tool -cw "filenametowrite"
等等


我在这里有点迷路了。如何将commons cli配置为具有两个文件名参数,这是基于指定的参数(选项)所必需的?这可能吗?

不幸的是,Commons CLI无法指定这样的相互依赖选项。要处理这个问题,您需要进行自己的
if
检查。比如说像这样,

CommandLineParser=new PosixParser();
选项=新选项();
options.addOption(新选项(“h”、“帮助”、false、“显示此消息”);
addOption(新选项(“c”,“创建”,true,“创建文件”);
addOption(新选项(“r”,“读取”,truee,“读取文件”);
options.addOption(新选项(“e”,“编辑”,false,“编辑文件”));
options.addOption(新选项(“d”,“display”,false,“显示文件”);
addOption(新选项(“w”,“write”,false,“write a file”);
addOption(新选项(“p”,“push”,false,“push a file”);
试一试{
CommandLine CommandLine=parser.parse(选项、参数);
if(commandLine.haspoption(“h”)){
showHelp(选项);
系统出口(0);
}
//验证命令行
//显然,可以将它们拆分,以提供更有用的错误消息
if((!(commandLine.haspoption(“c”)^(commandLine.haspoption(“r”)| commandLine.haspoption(“e”))
||!(commandLine.hasOption(“d”)^commandLine.hasOption(“w”)^commandLine.hasOption(“p”)){
抛出新的ParseException(“无效组合”);
}
if((!commandLine.haspoption(“c”)和&!commandLine.haspoption(“r”)){
抛出新的ParseException(“缺少必需的参数”);
}
//其余的逻辑
}捕获(解析异常pe){
抛出新的ParseException(“错误参数\n”+pe.getMessage());
}

commons cli库有一个流畅的包装器:

它有这样的能力:

new CmdLineAppBuilder(args)
  .withArg("integer-opt", "integer option description")
  .withArg("string-opt", "string option description")
  .withFlag("bool-flag", "bool-flag description")

  .withDependencies("bool-flag", "integer-opt", "string-opt")

  .withEntryPoint(cmdLine -> {})
.build().run();
这意味着,如果指定“bool flag”选项,还必须指定它的依赖项:“integer opt”和“string opt”,您不需要在自己的代码中管理它