Что такое 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» в реальном сервисе.