[英]Pass an argument that starts with '@' to jcommander
我使用JCommander(版本1.32)来解析传递给java应用程序的命令行参数(让我们称之为app
)。 我遇到的问题是我需要传递的一个参数以@
开头,可以看出这里有一个特殊的@
语法。 因此,使用app @arg
调用应用app @arg
失败
无法读取文件arg:java.io.FileNotFoundException:arg(没有这样的文件或目录)。
通过阅读这些信息,我尝试将我的参数放在一个文件中,但显然“@语法”是递归的,因此即使我将@arg
放在一个文件中,我的程序也会因同样的错误而失败。
有没有办法将以@
开头的参数传递给使用jcommander的程序? 有没有办法禁用@
语法?
由于OP和我之间的聊天讨论,我们得出以下结论:
作为解析命令的方式的一部分,JCommander调用自身 - 子命令结构,每个子命令结构都有自己的参数定义。
在顶层,它扩展了@ -parameter并创建了一个包含文件内容的新参数列表。
然后,当它自己调用时,它再次解析该参数列表,因此再次扩展以@
开头的任何参数。
幸运的是,它似乎只会这样做一次,所以它不是完全递归的。 因此,任何想要传递以@
开头的参数的人的解决方案都是使用两个间接。 也就是说,创建两个文件:
FILE1.TXT
@file2.txt
FILE2.TXT
@actualparameter
然后在命令行本身使用@file1.txt
。
所以这是一种可能的解决方法。 就个人而言,我不太乐意创建这样的额外文件,我建议其他三个解决方案之一:
@
机制或让原作者自己这样做。 @
开头的参数前面添加一个字符,然后在需要使用参数值时删除该字符。 至少这不会创建两个额外的文件。 根据对Jcommander的github上的这个pull请求的注释,有一种新方法允许禁用@
符号的处理。 例如
JCommander jc = new JCommander(params);
jc.setExpandAmpersat(false);
从1.54版开始添加了该方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.