gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:24:57 27 4
gpt4 key购买 nike

我正在使用 JCommander(版本 1.32)解析传递给 Java 应用程序(我们称它为 app)的命令行参数。我遇到的问题是我需要传递的参数之一以 @ 开头,可以看出 here @ 有一个特殊的语法。因此,使用 app @arg 调用应用程序失败并显示

Could not read file arg: java.io.FileNotFoundException: arg (No such file or directory).

通读这些信息后,我尝试将我的参数放在一个文件中,但显然“@ 语法”是递归的,因此即使我将 @arg 放在一个文件中,我的程序也会因同样的错误而失败。

有没有办法将以 @ 开头的参数传递给使用 jcommander 的程序?有没有办法禁用 @ 语法?

最佳答案

作为 OP 和我之间关于此的聊天讨论的结果,我们得出以下结论:

JCommander 调用自身,作为它解析命令 的方式的一部分 - 每个子命令结构都有自己的参数定义。

在顶层,它扩展@参数并创建一个包含文件内容的新参数列表。

然后,当它调用自身时,它再次解析该参数列表,因此再次扩展以 @ 开头的任何参数。

幸运的是,它似乎只执行一次,所以它不是完全递归的。因此,对于任何想要传递以 @ 开头的参数的人来说,解决方案是使用两个间接寻址。即创建两个文件:

文件1.txt

@file2.txt

文件2.txt

@actualparameter

然后在命令行本身上使用 @file1.txt

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

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

编辑:Jcommander 的作者修复了这个问题。

有一个新方法,根据this pull request on Jcommander's github的评论这允许禁用 @ 符号的处理。例如

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

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

关于java - 将以 '@' 开头的参数传递给 jcommander,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26845695/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com