Java Picocli:是否可以定义名称中带有空格的选项?

Java Picocli:是否可以定义名称中带有空格的选项?,java,command-line-arguments,picocli,Java,Command Line Arguments,Picocli,我在谷歌上搜索了一会儿,还搜索了StackOverflow,当然还有Picocli文档,但没有找到任何解决方案 我所在的公司对批处理程序中的命令行参数使用特殊格式: -VAR ARGUMENT1=VALUE -VAR ARGUMENT2=VALUE2 -VAR BOOLEANARG=FALSE (不要问我为什么使用这种格式,我已经质疑过了,没有得到正确的答案。) 现在我想使用Picocli进行命令行解析。但是,我不能让它与我们使用的参数格式一起工作,因为这个空间使Picocli认为这是两个独立

我在谷歌上搜索了一会儿,还搜索了StackOverflow,当然还有Picocli文档,但没有找到任何解决方案

我所在的公司对批处理程序中的命令行参数使用特殊格式:

-VAR ARGUMENT1=VALUE -VAR ARGUMENT2=VALUE2 -VAR BOOLEANARG=FALSE
(不要问我为什么使用这种格式,我已经质疑过了,没有得到正确的答案。) 现在我想使用Picocli进行命令行解析。但是,我不能让它与我们使用的参数格式一起工作,因为这个空间使Picocli认为这是两个独立的参数,因此它不会将它们识别为我定义的参数

这显然行不通:

@CommandLine.Option( names = { "-VAR BOOLEANARG" } )
boolean booleanarg = true;
使用-VAR BOOLEANARG=FALSE调用程序不会产生任何效果

有没有办法自定义包含空格的特殊选项名?或者我该怎么做?我也不允许将多个参数作为参数折叠到一个-VAR选项中

非常感谢你的帮助。 谢谢并致以最良好的祝愿, Rosa

解决方案1:地图选项 最简单的解决方案是使
-VAR
a。可能看起来像这样:

Usage: <main class> [-VAR <MyOption=String>]...
      -VAR <MyOption=String>
         Variable options. Valid keys: ARGUMENT1, OTHERARG, BOOLEANARG.
Usage: group-demo [-VAR (ARGUMENT1=<arg1> | OTHERARG=<otherValue> |
                  BOOLEANARG=<bool>)]... [-hV]
      -VAR                   Option prefix. Must be followed by one of
                               ARGUMENT1, OTHERARG or BOOLEANARG
      ARGUMENT1=<arg1>       An arg. Must be preceded by -VAR.
      OTHERARG=<otherValue>  Another arg. Must be preceded by -VAR.
      BOOLEANARG=<bool>      A boolean arg. Must be preceded by -VAR.
  -h, --help                 Show this help message and exit.
  -V, --version              Print version information and exit.
@命令(分隔符=”“)
类简单实现可运行{
枚举MyOption{ARGUMENT1,OTHERARG,BOOLEANARG}
@选项(name=“-VAR”,
description=“变量选项。有效键:${COMPLETION-CANDIDATES}。”)
地图选项;
@凌驾
公开募捐{
//这里的业务逻辑
}
公共静态void main(字符串[]args){
新命令行(new Simple()).execute(args);
}
}
此示例的用法帮助如下所示:

Usage: <main class> [-VAR <MyOption=String>]...
      -VAR <MyOption=String>
         Variable options. Valid keys: ARGUMENT1, OTHERARG, BOOLEANARG.
Usage: group-demo [-VAR (ARGUMENT1=<arg1> | OTHERARG=<otherValue> |
                  BOOLEANARG=<bool>)]... [-hV]
      -VAR                   Option prefix. Must be followed by one of
                               ARGUMENT1, OTHERARG or BOOLEANARG
      ARGUMENT1=<arg1>       An arg. Must be preceded by -VAR.
      OTHERARG=<otherValue>  Another arg. Must be preceded by -VAR.
      BOOLEANARG=<bool>      A boolean arg. Must be preceded by -VAR.
  -h, --help                 Show this help message and exit.
  -V, --version              Print version information and exit.
而实现过程可能如下所示:

Usage: <main class> [-VAR <MyOption=String>]...
      -VAR <MyOption=String>
         Variable options. Valid keys: ARGUMENT1, OTHERARG, BOOLEANARG.
Usage: group-demo [-VAR (ARGUMENT1=<arg1> | OTHERARG=<otherValue> |
                  BOOLEANARG=<bool>)]... [-hV]
      -VAR                   Option prefix. Must be followed by one of
                               ARGUMENT1, OTHERARG or BOOLEANARG
      ARGUMENT1=<arg1>       An arg. Must be preceded by -VAR.
      OTHERARG=<otherValue>  Another arg. Must be preceded by -VAR.
      BOOLEANARG=<bool>      A boolean arg. Must be preceded by -VAR.
  -h, --help                 Show this help message and exit.
  -V, --version              Print version information and exit.
@命令(name=“group demo”,mixinStandardHelpOptions=true,
排序选项=false)
类UsingGroups实现可运行{
静态类MyGroup{
@选项(names=“-VAR”,必需=true,
description=“Option prefix.后面必须跟ARGUMENT1、OTHERARG或BOOLEANARG中的一个”)
忽略布尔值;
静态类内部组{
@选项(name=“ARGUMENT1”,description=“参数前面必须加-VAR.”)
字符串arg1;
@选项(name=“OTHERARG”,description=“另一个arg.前面必须加-VAR.”)
字符串值;
@选项(names=“BOOLEANARG”,arity=“1”,
description=“布尔参数前面必须加-VAR”)
布尔布尔;
}
//独占:这些选项中只有一个可以跟随-VAR选项
//多重性=1:内部组必须出现一次
@ArgGroup(multiplicity=“1”,exclusive=true)
内组内;
}
//非排他性意味着同时发生,因此如果指定了-VAR,
//然后它后面必须跟一个InnerGroup选项
@ArgGroup(multiplicity=“0..*”,exclusive=false)
列出发生的事件;
@凌驾
公开募捐{
//这里的业务逻辑
System.out.printf(“您指定了%d-VAR选项。%n”,groupoccurrencess.size());
对于(MyGroup组:GroupInstances){
System.out.printf(“ARGUMENT1=%s,ARGUMENT2=%s,BOOLEANARG=%s%n”,
group.inner.arg1、group.inner.arg2、group.inner.arg3);
}
}
公共静态void main(字符串[]args){
新命令行(newusinggroups()).execute(args);
}
}
然后,使用组-VAR ARGUMENT1=abc-VAR BOOLEANARG=true调用
java将给出:

You specified 2 -VAR options.
ARGUMENT1=abc, OTHERARG=null, BOOLEANARG=null
ARGUMENT1=null, OTHERARG=null, BOOLEANARG=true
使用这种方法,每次最终用户指定
-VAR
时,您都会得到一个
MyGroup
对象。这个
MyGroup
对象有一个
InnerGroup
,它有许多字段,除了一个字段外,所有字段都是
null
。只有用户指定的字段是非空的。这就是这种方法的缺点:在应用程序中,您需要检查所有字段,以找到用户指定的非空字段。好处是,通过为
@选项
-注释字段选择正确的类型,值将自动转换为目标类型。

解决方案1:映射选项 最简单的解决方案是使
-VAR
a。可能看起来像这样:

Usage: <main class> [-VAR <MyOption=String>]...
      -VAR <MyOption=String>
         Variable options. Valid keys: ARGUMENT1, OTHERARG, BOOLEANARG.
Usage: group-demo [-VAR (ARGUMENT1=<arg1> | OTHERARG=<otherValue> |
                  BOOLEANARG=<bool>)]... [-hV]
      -VAR                   Option prefix. Must be followed by one of
                               ARGUMENT1, OTHERARG or BOOLEANARG
      ARGUMENT1=<arg1>       An arg. Must be preceded by -VAR.
      OTHERARG=<otherValue>  Another arg. Must be preceded by -VAR.
      BOOLEANARG=<bool>      A boolean arg. Must be preceded by -VAR.
  -h, --help                 Show this help message and exit.
  -V, --version              Print version information and exit.
@命令(分隔符=”“)
类简单实现可运行{
枚举MyOption{ARGUMENT1,OTHERARG,BOOLEANARG}
@选项(name=“-VAR”,
description=“变量选项。有效键:${COMPLETION-CANDIDATES}。”)
地图选项;
@凌驾
公开募捐{
//这里的业务逻辑
}
公共静态void main(字符串[]args){
新命令行(new Simple()).execute(args);
}
}
此示例的用法帮助如下所示:

Usage: <main class> [-VAR <MyOption=String>]...
      -VAR <MyOption=String>
         Variable options. Valid keys: ARGUMENT1, OTHERARG, BOOLEANARG.
Usage: group-demo [-VAR (ARGUMENT1=<arg1> | OTHERARG=<otherValue> |
                  BOOLEANARG=<bool>)]... [-hV]
      -VAR                   Option prefix. Must be followed by one of
                               ARGUMENT1, OTHERARG or BOOLEANARG
      ARGUMENT1=<arg1>       An arg. Must be preceded by -VAR.
      OTHERARG=<otherValue>  Another arg. Must be preceded by -VAR.
      BOOLEANARG=<bool>      A boolean arg. Must be preceded by -VAR.
  -h, --help                 Show this help message and exit.
  -V, --version              Print version information and exit.
而实现过程可能如下所示:

Usage: <main class> [-VAR <MyOption=String>]...
      -VAR <MyOption=String>
         Variable options. Valid keys: ARGUMENT1, OTHERARG, BOOLEANARG.
Usage: group-demo [-VAR (ARGUMENT1=<arg1> | OTHERARG=<otherValue> |
                  BOOLEANARG=<bool>)]... [-hV]
      -VAR                   Option prefix. Must be followed by one of
                               ARGUMENT1, OTHERARG or BOOLEANARG
      ARGUMENT1=<arg1>       An arg. Must be preceded by -VAR.
      OTHERARG=<otherValue>  Another arg. Must be preceded by -VAR.
      BOOLEANARG=<bool>      A boolean arg. Must be preceded by -VAR.
  -h, --help                 Show this help message and exit.
  -V, --version              Print version information and exit.
@命令(name=“group demo”,mixinStandardHelpOptions=true,
排序选项=false)
类UsingGroups实现可运行{
静态类MyGroup{
@选项(names=“-VAR”,必需=true,
description=“Option prefix.后面必须跟ARGUMENT1、OTHERARG或BOOLEANARG中的一个”)
忽略布尔值;
静态类内部组{
@选项(name=“ARGUMENT1”,description=“参数前面必须加-VAR.”)
字符串arg1;
@选项(name=“OTHERARG”,description=“另一个arg.前面必须加-VAR.”)
字符串值;
@选项(names=“BOOLEANARG”,arity=“1”,
description=“布尔参数前面必须加-VAR”)
布尔布尔;
}
//独占:这些选项中只有一个可以跟随-VAR选项
//多重性=1:内部组必须出现一次
@ArgGroup(multiplicity=“1”,exclusive=true)
内组内;
}
//非排他性意味着同时发生,因此如果指定了-VAR,
//然后它后面必须跟一个InnerGroup选项
@ArgGroup