QuarkusJuniorTechnical

Что такое Dev Mode в Quarkus и какие возможности он предоставляет (hot reload, Dev Services)?

Dev Mode запускается командой ./mvnw quarkus:dev и обеспечивает live coding: исходники перекомпилируются инкрементально при первом HTTP-запросе после сохранения файла. Dev Services автоматически поднимают PostgreSQL, Kafka и другие зависимости в Docker-контейнерах.

Запуск Dev Mode

Dev Mode активируется командой ./mvnw quarkus:dev (Maven) или ./gradlew quarkusDev (Gradle). Quarkus запускает приложение в том же JVM-процессе, что и сборщик, и отслеживает изменения исходных файлов через файловый вотчер.

# Запуск Dev Mode
./mvnw quarkus:dev

# С отладочным портом (JDWP)
./mvnw quarkus:dev -Ddebug=5005

# С переопределением порта приложения
./mvnw quarkus:dev -Dquarkus.http.port=8081

Live Coding (Hot Reload)

При сохранении .java, .properties или шаблонного файла Quarkus не перезапускает JVM. Вместо этого при следующем HTTP-запросе он инкрементально перекомпилирует только изменённые классы, перезапускает CDI-контекст ArC и применяет новый байткод. Весь цикл занимает десятки миллисекунд.

Если компиляция завершилась с ошибкой, Quarkus отображает её прямо в браузере в виде красной страницы — не нужно смотреть в терминал.

Dev UI

В Dev Mode доступен Dev UI по адресу http://localhost:8080/q/dev-ui. Он предоставляет визуальный интерфейс для: просмотра зарегистрированных CDI-бинов, управления feature flags, выполнения SQL-запросов к Dev Services БД, просмотра логов и трейсов, а также запуска тестов.

Dev Services

Если в classpath есть extension для базы данных, Kafka, Redis или другого сервиса, а явный quarkus.datasource.jdbc.url (или аналог) не задан, Quarkus автоматически поднимает нужный Testcontainers-контейнер. Это называется Dev Services.

# application.properties — Dev Services для PostgreSQL
# Достаточно НЕ указывать jdbc.url, и Quarkus сам поднимет контейнер
quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=quarkus
quarkus.datasource.password=quarkus

# Отключить Dev Services (если есть реальный сервер)
%dev.quarkus.datasource.devservices.enabled=false
%dev.quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/mydb

Continuous Testing

В Dev Mode встроен режим непрерывного тестирования. Нажатие клавиши r в консоли запускает все тесты; o — только изменённые. Quarkus отслеживает зависимости между тестами и исходниками и перезапускает только релевантные тесты после изменения кода.

# Статус тестов в консоли Dev Mode
# Нажмите 'r' для запуска тестов
# Нажмите 'h' для справки по горячим клавишам

Подводные камни

  • Dev Mode использует другой lifecycle, чем production: @ApplicationScoped бины пересоздаются при reload, но состояние в памяти (кэши, статические поля) может сохраняться — это вводит в заблуждение при отладке.
  • Dev Services требуют работающего Docker-демона. На macOS с Colima или Podman нужно дополнительно настроить DOCKER_HOST.
  • Производительность в Dev Mode не отражает production: нет AOT-оптимизаций, есть overhead от file watcher и инкрементальной компиляции.
  • Изменения в @BuildStep-процессорах собственных extensions не подхватываются hot reload — требуется полная пересборка.
  • Dev Services поднимают контейнер с каждым запуском Dev Mode, если не включён quarkus.devservices.reuse=true — это замедляет первый старт.
  • Dev UI доступен только в dev/test профилях; попытка открыть /q/dev-ui на production-сборке вернёт 404.
  • Если порт 8080 занят, Quarkus завершится с ошибкой без попытки занять следующий свободный порт — нужно явно задать quarkus.http.port.
  • Continuous Testing в dev mode использует отдельный ClassLoader и может вести себя иначе, чем mvn test — прохождение тестов в одном режиме не гарантирует прохождение в другом.

Common mistakes

  • Путать термин «dev mode» с соседним механизмом Quarkus.
  • Не называть границу lifecycle, transaction, thread или request для «dev mode».
  • Игнорировать production-эффекты «dev mode»: latency, SQL shape, memory, security или observability.

What the interviewer is testing

  • Попросить объяснить механизм «dev mode» на минимальном примере.
  • Проверить, видит ли кандидат failure mode и диагностику для «dev mode».
  • Уточнить, какие настройки или API меняют «dev mode» в реальном сервисе.

Sources

Related topics