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

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

/**
 * Sample program from args4j site (modified)
 * @author
 *      Kohsuke Kawaguchi ([email protected])
 */
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);


那是最好的方法吗?

最佳答案

我在文档中找到了这个:



您在上面的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
    }
}

10-03 00:07