属性“requiredOptionMarker”的类型应为“java.lang.Character”;但发现类型为“java.lang.String”

Attribute 'requiredOptionMarker' should have type 'java.lang.Character'; but found type 'java.lang.String'

提问人:Asif Kamran Malick 提问时间:11/13/2023 最后编辑:Asif Kamran Malick 更新时间:11/14/2023 访问量:31

问:

在 Groovy 3.0.19 中运行脚本失败,但在 Groovy 4.0.15通过

我正在尝试遵循特定于 groovy 脚本的 picocli 文档说明:第 30.1.2 节。Groovy 脚本

有一个名为 Command 的特定注释,它具有 requiredOptionMarker 属性。请参阅第 14.4.4 节。Required-Option Marker requiredOptionMarker 接受字符。

在我的脚本中,当我尝试将“*”分配给requiredOptionMarker时,我的脚本无法编译。

@Command(name = "sampleScript",
        mixinStandardHelpOptions = true,
        requiredOptionMarker = '*')

我收到错误:

Attribute 'requiredOptionMarker' should have type 'java.lang.Character'; but found type 'java.lang.String' in @picocli.CommandLine$Command
 @ line 63, column 32.
           requiredOptionMarker = '*',
                                  ^

1 error

尝试了各种建议,例如,.似乎没有任何效果。(char) '*''*' as char

在寻找它时,我最接近的是这张 jira 票 GROOVY-3278

任何帮助都非常感谢。

编辑1:开始

以防万一有人想玩,我有一个 MCVE

https://github.com/akmalick/sample-picocli/blob/requiredOptionMarker/sample-picocli.groovy

master 分支包含将 PASS 的脚本

requiredOptionMarker 分支包含重新创建问题的脚本,并在包含更改时失败requiredOptionMarker = '*'

编辑1:结束

编辑2:开始

处理逗号后,如

sortOptions = false,
    requiredOptionMarker = ((char)'*') //---->>>>> This DOES"T WORK

在没有编译 tatic 的情况下运行我得到这样的东西

>groovy sample-picocli.groovy

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
C:\ws\sample-picocli.groovy: 35: Expected '(char) *' to be an inline constant of type char in @picocli.CommandLine$Command
 @ line 35, column 32.
           requiredOptionMarker = ((char)'*') //---->>>>> This DOES"T WORK
                                  ^

C:\ws\picocli\sample-picocli.groovy: 35: Attribute 'requiredOptionMarker' should have type 'java.lang.Character'; but found type 'java.lang.Object' in @picocli.CommandLine$Command
 @ line 35, column 32.
           requiredOptionMarker = ((char)'*') //---->>>>> This DOES"T WORK
                                  ^

C:\ws\picocli\sample-picocli.groovy: 35: Expected '(char) *' to be an inline constant of type char in @picocli.CommandLine$Command
 @ line 35, column 32.
           requiredOptionMarker = ((char)'*') //---->>>>> This DOES"T WORK
                                  ^

C:\ws\picocli\sample-picocli.groovy: 35: Attribute 'requiredOptionMarker' should have type 'java.lang.Character'; but found type 'java.lang.Object' in @picocli.CommandLine$Command
 @ line 35, column 32.
           requiredOptionMarker = ((char)'*') //---->>>>> This DOES"T WORK
                                  ^

4 errors

编辑2:结束

时髦的 皮科利

评论


答:

0赞 Remko Popma 11/13/2023 #1

您是否尝试过此处介绍的解决方案?https://stackoverflow.com/a/33020020/1446916

基本上在你的脚本中做一个硬性转换:

@Command(
       …
    requiredOptionMarker = ((char) '*'))

请注意,您需要将整个事情括起来:,只是可能不起作用。((char) '*')(char) '*'

评论

0赞 Asif Kamran Malick 11/13/2023
一般来说,除非使用编译静态,否则恐怕这是行不通的。如果我静态编译我的脚本,它会失败并出现大量编译错误,这些错误要么与未声明的变量有关,要么找不到匹配的方法。此外,我的时髦脚本没有类。我已经更新了我的 OP 以添加 MCVE 脚本
0赞 Remko Popma 11/14/2023
在 GitHub 项目中,我注意到前一行 和 之间的逗号不在前一行的末尾,而是在 requiredOptionMarker 行的开头。Groovy 经常会遇到这方面的问题。在没有编译静态的情况下,您会看到哪些错误?requiredOptionMarker = '*'
0赞 Asif Kamran Malick 11/14/2023
我在部分下添加了详细信息。但是,我还想分享一下,我刚刚知道这是一个错误EDIT 2