【问题标题】:How do I access main context in sub-commands using args4j to implement sub-command handler?如何使用 args4j 访问子命令中的主上下文以实现子命令处理程序?
【发布时间】:2015-01-10 03:50:00
【问题描述】:

我刚刚发现 args4j,来自 commons-cli 的使用非常好!

我正在实现a sub-command handler,其中每个子命令都需要访问通过使用所有子命令通用的凭据登录而获得的会话对象。如果我在主类中创建会话,子命令将无权访问。我可以在各个子命令中创建会话,但为此我需要访问完整的参数。

/**
 * Sample program from args4j site (modified)
 * @author
 *      Kohsuke Kawaguchi (kk@kohsuke.org)
 */
public class SampleMain {
    // needed by all subcommands
    Session somesession;

    @Option(name="-u",usage="user")
    private String user = "notsetyet";

    @Option(name="-p",usage="passwd")
    private String passwd = "notsetyet";

    @Argument(required=true,index=0,metaVar="action",usage="subcommands, e.g., {search|modify|delete}",handler=SubCommandHandler.class)
    @SubCommands({
      @SubCommand(name="search",impl=SearchSubcommand.class),
      @SubCommand(name="delete",impl=DeleteSubcommand.class),
    })
    protected Subcommand action;

    public void doMain(String[] args) throws IOException {
        CmdLineParser parser = new CmdLineParser(this);
        try {
            parser.parseArgument(args);
            // here I want to do my things in the subclasses 
            // but how will the subcommands get either:
            // a) the session object (which I could create in this main class), or
            // b) the options from the main command in order to create their own session obj
            action.execute();
        } catch( CmdLineException e ) {
            System.err.println(e.getMessage());
            return;
        }
    }
}

简而言之,如何创建适用于所有子命令的会话?

它本身可能不是 args4j 的东西,也许在我对子类如何获得正确上下文的思考中存在某种类型的设计差距。谢谢!

编辑:我想我可以将会话对象传递给子类。例如:

action.execute(somesession);

这是最好的方法吗?

【问题讨论】:

    标签: java design-patterns command-line-arguments args4j


    【解决方案1】:

    我在文档中找到了这个:

    • 您在上面的 Git 类中定义的任何选项都可以解析出现在子命令名称之前的选项。这对于定义跨子命令工作的全局选项很有用。
    • 匹配的子命令实现使用默认构造函数进行实例化,然后将创建一个新的 CmdLineParser 来解析其注释。

    这很酷,所以我想我的想法是传入我在主级别创建的任何新对象,然后注释我需要的其他子命令选项。

    public class DeleteCommand extends SubCommand {
        private Session somesession;
    
        @Option(name="-id",usage="ID to delete")
        private String id = "setme";
        public void execute(Session asession) {
            somesession = asession;
            // do my stuff
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-13
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 2023-03-23
      • 2019-07-19
      相关资源
      最近更新 更多