На одной из встреч 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 г.