1

我有一个简单Command的强制性参数:

@Parameters(index = "0", description = "manifest")
private File manifest;

当我在没有参数的情况下从命令行调用它时,我得到了预期的消息:

Missing required parameter: <manifest>
Usage ....

但是:调用的返回码为java0,表示一切正常。如果参数(或选项)丢失/不正确,有没有办法picocli返回非零代码?

4

1 回答 1

2

是的,这是可能的。

更新:由于 picocli 4.0 退出代码支持非常容易使用该execute方法。

picocli 4.0 的示例:

@Command
class ExitCodeDemo implements Callable<Integer> {
    @Parameters(index = "0", description = "manifest")
    private File manifest;

    public Integer call() {
        // business logic here
        return ok ? 0 : 123;
    }

    public static void main(String... args) {
        int exitCode = new CommandLine(new ExitCodeDemo()).execute(args);
        System.exit(exitCode);
    }
}

1如果业务逻辑发生异常,2如果用户输入无效,并且一切顺利,则上述程序将退出,0或者123根据业务逻辑退出(参见call方法)。

如果“标准”错误代码足以满足您的应用程序,您还可以实现Runnable.


在 picocli 4.0 之前,应用程序需要使用该parseWithHandlers方法。现在已弃用,但这是一个示例。如果用户提供了无效输入,以下程序将以退出代码 456 退出:

// OLD: for picocli versions before 4.0 (DEPRECATED)
//
@Command
class Deprecated implements Runnable {
    @Parameters(index = "0", description = "manifest")
    private File manifest;

    public void run() { 
        // business logic here
    }

    public static void main(String... args) {
        CommandLine cmd = new CommandLine(new Deprecated());
        cmd.parseWithHandlers(
                new RunLast(),
                CommandLine.defaultExceptionHandler().andExit(456),
                args);
    }
}

有计划在 4.0 版中为 picocli添加更好的退出代码支持。

于 2019-03-29T16:48:32.893 回答