为了账号安全,请及时绑定邮箱和手机立即绑定

带有 picocli 的可扩展应用程序。最佳实践问题

带有 picocli 的可扩展应用程序。最佳实践问题

Qyouu 2022-01-06 19:48:13
假设我的项目有很多逻辑,并且有一些入口点,它们是 CLI 命令。我用 注释我的入口点@Command,初始化我@Parameters和@Option注释的字段并执行逻辑,不再需要 CLI。在我看来,为main每个带@Command注释的类声明 1 个方法适合我,但是,我不确定这是否是个好主意。也许某种CommandFactory是必要的?我之前从未构建过 CLI 应用程序或使用过 picocli,所以如果我的思考过程有误,请指出。
查看完整描述

1 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

main对于@Command作为入口点的每个方法都有一个单独的方法是完全没问题的。main需要该方法,以便可以从命令行独立调用该命令。


例如:


@Command(name = "hello")

class Hello implements Runnable {

    public static void main(String[] args) {

        CommandLine.run(new Hello(), args);

    }

    public void run() { System.out.println("hello"); }

}


@Command(name = "bye")

class Bye implements Runnable {

    public static void main(String[] args) {

        CommandLine.run(new Bye(), args);

    }

    public void run() { System.out.println("bye"); }

}

一种例外情况是当您的应用程序具有带有子命令的命令时。在这种情况下,您只需要main为顶级命令提供方法,而不需要为子命令提供方法。


带有子命令的示例:


@Command(name = "git", subcommands = {Commit.class, Status.class})

class Git implements Runnable {

    public static void main(String[] args) { // top-level command needs main

        CommandLine.run(new Git(), args);

    }

    public void run() { System.out.println("Specify a subcommand"); }

}


@Command(name = "commit")

class Commit implements Runnable {

    @Option(names = "-m") String message;

    @Parameters File[] files;


    public void run() {

        System.out.printf("Committing %s with message '%s'%n",

                Arrays.toString(files), message);

    }

}


@Command(name = "status")

class Status implements Runnable {

    public void run() { System.out.println("All ok."); }

}

注意,main当有子命令时,只有顶级命令需要一个方法。即使使用子命令,也不需要工厂。


查看完整回答
反对 回复 2022-01-06
  • 1 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信