Ненулевой код выхода при отсутствующем параметре с помощью picocli

#picocli

#picocli

Вопрос:

У меня есть простой Command с одним обязательным параметром:

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

Когда я вызываю его из командной строки без параметра, я получаю ожидаемое сообщение:

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

НО: код возврата для вызова java равен 0, что означает, что все прошло нормально.
Есть ли способ picocli вернуть ненулевой код, если параметр (или опция) отсутствует / некорректен?

Ответ №1:

Да, это возможно.

ОБНОВЛЕНИЕ: С помощью execute метода поддержка кода выхода picocli 4.0 очень проста.

Пример с 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);
    }
}
  

Планируется добавить лучшую поддержку кода выхода в picocli в версии 4.0.