![](/img/trans.png)
[英]In java, possible side effects of synchronizing on ClassName.class instead of on instance of a class?
[英]Possible side effects when several CommandLine instance "work" on the same instance of an annotated class?
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 选项,除非它直接来自命令行。
我确实让它工作了:几个 CommandLine 实例确实可以在一个带注释的类的同一个实例上工作,而不会相互干扰。
有一些问题,我不得不解决一个奇怪的 picoCLI 怪癖,但这不完全是这个问题的答案的一部分,所以我在另一个问题中解释了它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.