【问题标题】:Possible side effects when several CommandLine instance "work" on the same instance of an annotated class?当多个 CommandLine 实例在带注释的类的同一实例上“工作”时可能产生副作用?
【发布时间】:2022-07-06 07:04:22
【问题描述】:

picoCLI 的@-file 机制几乎是我需要的,但不完全是。原因是我想控制解析的其他文件的确切位置——取决于以前的选项值。

示例:使用选项调用时 srcfolder=/a/b optionfile=of.txt,我的程序应该会看到从/a/b/of.txt 读取的附加选项,但是当使用srcfolder=../c optionfile=of.txt 调用时,它应该会看到来自../c/of.txt 的选项。

@-file 机制无法做到这一点,因为它会在处理任何选项值之前扩展所有选项文件(总是相对于当前文件夹,如果它们是相对的)。

所以我想要 picoCLI...

  • “从左到右”处理选项,
  • optionfile 选项中提及选项文件时递归解析它,
  • 然后继续使用以下选项。

我也许可以通过从带注释的 setter 方法中递归地开始解析来解决这个问题:

...
Config cfg = new Config();
CommandLine cmd = new CommandLine(cfg);
cmd.parseArgs(a);
...

public class Config {
    @Option(names="srcfolder")
    public void setSrcfolder(String path) {
        this.srcfolder=path;
    }
    @Option(names="optionfile")
    public void parseOptionFile(String pathAndName) {
        // validate path, do some other housekeeping...
        CommandLine cmd = new CommandLine(this /* same Config instance! */ );
        cmd.parseArgs(new String[] { "@"+this.srcfolder + pathAndName });
    }
...

这样,多个CommandLine 实例将在同一个Config 实例上调用setter 方法,递归地相互“中断”。现在是真正的问题:这是一个问题吗?

当然,我的Config 类有状态。但是如果其他CommandLine 实例也修改cfg“在选项之间”,CommandLine 实例是否也有可能会搞砸的状态?

感谢您的任何见解!

编辑添加:我试过了,我在@-file 选项上得到一个UnmatchedArgumentException

Exception in thread "main" picocli.CommandLine$UnmatchedArgumentException: Unmatched argument at index 0: '@/path/to/configfile'
    at picocli.CommandLine$Interpreter.validateConstraints(CommandLine.java:13490)
...

所以首先我必须解决这个问题:显然 picoCLI 不会扩展 @-file 选项,除非它直接来自命令行。

【问题讨论】:

    标签: java picocli


    【解决方案1】:

    我确实让它工作了:多个 CommandLine 实例可以确实在一个带注释的类的同一个实例上工作,而不会相互干扰。

    有一些问题,我不得不解决一个奇怪的 picoCLI 怪癖,但这并不是这个问题的答案的一部分,所以我在other question 中解释了它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 2022-12-10
      相关资源
      最近更新 更多