繁体   English   中英

将以'@'开头的参数传递给jcommander

[英]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

所以这是一种可能的解决方法。 就个人而言,我不太乐意创建这样的额外文件,我建议其他三个解决方案之一:

  1. 使用不同的命令行解析器。
  2. 修补JCommander源代码,以便有办法逃脱@机制或让原作者自己这样做。
  3. 作为kludge,在任何可能以@开头的参数前面添加一个字符,然后在需要使用参数值时删除该字符。 至少这不会创建两个额外的文件。

编辑:Jcommander的作者解决了这个问题。

根据对Jcommander的github上的这个pull请求的注释,有一种新方法允许禁用@符号的处理。 例如

JCommander jc = new JCommander(params);
jc.setExpandAmpersat(false);

从1.54版开始添加了该方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM