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

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

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

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

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

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


person Chirlo    schedule 28.03.2019    source источник


Ответы (1)


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

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

Пример с пикокли 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.


До пикокли 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. .

person Remko Popma    schedule 29.03.2019