На одной из встреч DevNation Макс Андерсен представил новую функцию Quarkus под названием Командный режим, благодаря ему я написал эту статью.

Quarkus 1.4.0.CR1 представил нам действительно интересную особенность. В этой статье вы увидите, как управлять своим приложением Quarkus через командную строку и запускать quarkus из основного метода. Если вы когда-либо использовали Laravel, например, вы знаете, что он действительно отлично поддерживает командную строку.

Командный режим Quarkus дает вам возможность написать приложение (или его часть), которое запускается, выполняет некоторую работу и затем закрывается.

Для более удобного копирования и вставки откройте эту статью о Quarkify.

Настройка проекта

Командный режим уже включен в Quarkus 1.4.0.Final. Вы можете создать новое приложение или использовать наш пустой проект git. На момент написания Quarkus 1.4.0 еще находится в процессе публикации, но вы можете использовать http://che.openshift.io/, чтобы использовать его без необходимости сборки самого проекта quarkus.

Клонируем проект quarkus-command-mode:

git clone --branch clean https://github.com/quarkifynet/quarkus-command-mode.git

Это наш знаменитый пример приветствия, уже размещенный на 1.4.0.Final. Помните, что он не будет работать с версиями ниже 1.4.0. Посмотрите вокруг проекта, вы увидите GreetingResource и GreetingService. Давайте добавим новый класс в src/main/java/org.../started/GreetingApplication.java и сделаем так, чтобы он реализовывал QuarkusApplication, например:

@QuarkusMain
public class GreetingApplication implements QuarkusApplication {
}

Теперь вам будет предложено реализовать метод из QuarkusApplication под названием run, давайте сделаем это.

@Override
public int run(String... args) throws Exception {
    return 0;
}

Хорошо, теперь он готов к использованию, но у нас нет интересных вариантов использования, давайте добавим к нему несколько полезных команд, вот последний пример того, как он выглядит

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

./mvnw compile quarkus:dev -Dquarkus.args="--help"

Добавление compile к нашей обычной команде maven включит командный режим, и для вывода вы увидите обычный вывод консоли, но с одной дополнительной строкой.

2020-04-23 23:24:34,949 INFO [io.quarkus] (Quarkus Main Thread) getting-started 1.0-SNAPSHOT (powered by Quarkus 1.4.0.Final) started in 0.902s. Listening on: http://0.0.0.0:8080
2020-04-23 23:24:34,966 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2020-04-23 23:24:34,966 INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy]
2020-04-23 23:24:34,967 INFO [org.acm.get.sta.GreetingApplication] (Quarkus Main Thread)
This tool helps greet users by their name
Available commands:
--help Show helpful message
--greet={name} Greet person by their name
2020-04-23 23:24:34,994 INFO [io.quarkus] (Quarkus Main Thread) getting-started stopped in 0.026s
Quarkus application exited with code 0
Press Enter to restart or Ctrl + C to quit

Это наш вывод справки. Если вы укажете -Dquarkus.args = ”- greet = Quarkify”, вы получите от нас приветствие.

./mvnw compile quarkus:dev -Dquarkus.args="--greet=Quarkify"
# ... ommited lines
# 2020-04-23 23:01:36,092 INFO [org.acm.get.sta.GreetingApplication] (Quarkus Main Thread) hello Quarkify

Обратите внимание, что приложение завершается в конце фразой Press Enter to restart or Ctrl + C to quit. Это главная магия командного режима. Вы можете нажать Enter, и ваше приложение повторит тот же цикл, это полезно, когда вы что-то меняете в коде, а затем нажимаете Enter, чтобы увидеть новый результат.

Впрыскивание фасоли

Но подождите, вы заметили, что мы не использовали наш GreetingService. Это его основная цель - отделиться от любой логики представления, чтобы мы могли использовать ее либо из нашего ресурса, либо из командной строки, давайте исправим это. Во-первых, давайте введем наш GreetingService в GreetingApplication. Обратите внимание, что Our @QuarkusMain автоматически делает класс ограниченным, поэтому нам не нужно добавлять @ApplicationScoped.

@QuarkusMain
public class GreetingApplication implements QuarkusApplication {
    @Inject
    GreetingService greetingService;
...
}

Теперь, в том месте, где мы вручную написали LOGGER.info("hello" + name);, давайте заменим его внедренной службой:

if (args[0].startsWith("--greet")) {
    String name = args[0].substring(8);
    LOGGER.info(greetingService.greeting(name));
    return 0;
}

Вот полный курс. Вы можете позвонить по номеру git checkout master, чтобы выполнить все шаги, описанные выше.

Теперь все работает правильно, вы можете изменить приветствие в одном месте под названием GrettingService, и это повлияет как на веб-ресурсы, так и на командную строку! Остался только один бонус.

Запустить приложение из IDE

Если вы пользователь Intellij IDEA, вас может раздражать необходимость использовать командную строку или команду maven для запуска Quarkus. В командном режиме это разочарование также уходит. Вы можете снова использовать git checkout feature/ide, чтобы получить код для этого раздела.

Во-первых, скажем нашей run функции, что если нет аргументов, мы не хотим завершать работу Quarkus, это можно сделать с помощью Quarkus.waitForExit();.

public int run(String... args) throws Exception {
    if(args.length == 0) {
        Quarkus.waitForExit();
        return 0;
     }
...

Теперь мы можем создать приятную main функцию и вызвать Quarkus.run()

public static void main(String[] args) {
      Quarkus.run(GreetingApplication.class);
}

Как всегда, вот полный пример для нашего класса:

Готово, вы можете использовать свою любимую среду IDE для запуска Quarkus без командной строки.

Заключение

Командный режим может дать вам больше гибкости и свободы. Вы можете не только вызывать простой GreetingService, но и запрашивать пользователей из базы данных, выполнять миграции, запускать некоторые задания, выполнять сложную логику с несколькими атрибутами, которая в противном случае могла бы занять больше времени, и даже автоматизировать некоторые вещи.

Одно из отличных направлений, которое вы можете выбрать, - это посмотреть на Пикколи. Это может помочь вам создать красивый интерфейс командной строки или команды синтаксического анализа и структурирования (как, например, в Laravel). Более того, вы также можете использовать командный режим в образах в машинном коде.

Первоначально опубликовано на https://quarkify.net 23 апреля 2020 г.