java - Picocli 不会在每次执行时重置集合字段?
问题描述
我最近将我的项目升级到 Picocli 4.2.0,包括删除所有不推荐使用的方法调用,并且我一直在继续我在这里描述的工作。我又遇到了同样的问题——我有一个似乎没有重置的字段。与我的其他问题唯一不同的是,现在该字段是一个集合。代码如下所示:
@Command(name="watch", description="Alters the set of watched productions", subcommands={HelpCommand.class})
static public class Watch implements Runnable
{
@ParentCommand
ProductionC parent; // injected by picocli
@Option(names={"on", "-e", "--on", "--enable"}, description="Enables watching of given productions")
List<String> productionsToEnable;
@Option(names={"off", "-d", "--off", "--disable"}, description="Disables watching of given productions")
List<String> productionsToDisable;
@Override
public void run()
{ ... }
(此处提供完整代码。)
具体来说,productionsToEnable
似乎没有重置。调用的方式是单元测试的一部分:
@Test
public void testCanListTracedRules() throws Exception
{
loadRules();
agent.getInterpreter().eval("production watch --on b");
agent.getInterpreter().eval("production watch --on c");
final StringWriter result = new StringWriter();
agent.getPrinter().pushWriter(result);
agent.getInterpreter().eval("production watch");
agent.getPrinter().popWriter();
assertEquals("b\nc", result.toString());
}
(此处提供完整代码。)
当最后一次调用命令时"c"
,最后一次调用的字符串production watch
仍然存在。productionsToEnable
production watch
eval
请注意,上面的代码链接位于jsoar-command-performance
分支上,以防有助于仔细查看。
解决方案
picocli 4.2.0 中有一个回归,这意味着在重用实例@Option
时,子命令中的带注释字段不会重置为其初始值。CommandLine
此问题在此票证的 picocli 项目问题跟踪器中进行跟踪。(状态 2020-04-20:固定在 master 中。)
范围
在 picocli 4.2.0 中,子命令选项在调用之间不会被清除。这会影响在多次调用中重用一个CommandLine
实例的应用程序。如果在第一次调用中指定了选项而在第二次调用中省略了选项,它将错误地保留第一次调用的值。
当子命令在 JVM 进程中仅调用一次时,该问题不会出现。此外,不重用CommandLine
实例的应用程序和没有子命令的应用程序不受影响。
该问题在 4.2.0 版本中引入,在 picocli 4.1.4 及更早版本中不存在。
解决方法
此回归不适用于defaultValue
在注释中定义的选项:定义为的选项@Option(... defaultValue="...")
将在多次调用之间正确重置为默认值。尽可能使用 defaultValue 注释。
原因
picocli问题跟踪器上的工单有更多详细信息和进度更新。
推荐阅读
- java - 如何在eclipse中调用在其他文件上创建的数组?
- python - Python Pydot如何旋转边缘标签
- c++ - 将所有未知的方法调用和属性使用转发到 C++ 中的特殊函数
- ruby-on-rails - 部署到 Heroku 时出现 Rails rake 问题
- python - discord py - 在多个服务器上删除具有相同内容的消息(原始删除)
- javascript - docker中的MongoDB:将变量传递给脚本
- javascript - Webpack 确定资产入口
- python - 如何获取帐户的每个关注者的名称并使用python打印用户名
- ruby-on-rails - Postgres 和 Ruby - 有没有更好的方法来构建我的数据库?
- java - 在圆圈内点击画线