作为我和OP之间关于这个的聊天讨论的结果,我们得出了以下结论:
JCommander 调用自身,作为它解析命令的方式的一部分——每个子命令结构都有自己的参数定义。
在顶层,它扩展@参数并创建一个包含文件内容的新参数列表。
然后,当它调用自己时,它再次解析该参数列表,因此再次扩展以 a 开头的任何参数@
。
幸运的是,它似乎只这样做了一次,所以它不是完全递归的。因此,任何想要传递以开头的参数的人的解决方案@
是使用两个间接。即创建两个文件:
文件1.txt
@file2.txt
文件2.txt
@actualparameter
然后@file1.txt
在命令行本身上使用。
所以这是一个可能的解决方法。就个人而言,我对创建这样的额外文件不太满意,我建议使用其他三种解决方案之一:
- 使用不同的命令行解析器。
- 为 JCommander 源代码打补丁,以便有办法逃脱
@
机制或要求原作者自己这样做。
- 作为一个组合,在任何可能以 a 开头的参数前添加一个字符
@
,然后在我需要使用参数值时删除该字符。至少这不会创建两个额外的文件。
编辑:Jcommander 的作者修复了这个问题。
根据Jcommander 的 github 上对此拉取请求的评论,有一种新方法允许禁用对@
标志的处理。例如
JCommander jc = new JCommander(params);
jc.setExpandAmpersat(false);
从 1.54 版开始添加该方法。