Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Сборка для продакшена

Пока мы запускали приложение в режиме разработки: Vaadin следил за изменениями, показывал подробные ошибки и панель разработчика в углу страницы. На сервере всё это не нужно и даже вредно. Production-режим — это готовая сборка интерфейса, без инструментов разработки, с короткими сообщениями об ошибках. Spring Boot упаковывает всё приложение вместе с сервером Tomcat в один JAR-файл.

Сборка

./mvnw clean package

Maven компилирует код, прогоняет тесты, а плагин vaadin-maven-plugin готовит фронтенд. В логе видно:

[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0
[INFO] --- vaadin:25.3.0:build-frontend (default) @ blog ---
[INFO] Checking if a production mode bundle build is needed
[INFO] A production mode bundle build is not needed
[INFO] Building jar: .../blog/target/blog-1.0-SNAPSHOT.jar
[INFO] BUILD SUCCESS

Строки сокращены. «Bundle build is not needed» значит, что Vaadin взял готовую сборку стандартных компонентов, и Node.js не понадобился. Если подключить свои веб-компоненты или дополнения с фронтенд-кодом, плагин соберёт фронтенд сам и при необходимости скачает Node.js.

Режим разработки не попадает в сборку

Зависимость vaadin-dev в pom.xml помечена <optional>true</optional>. Spring Boot не кладёт такие зависимости в итоговый JAR, и без неё Vaadin включает production-режим сам. Отдельный профиль Maven для этого в Vaadin 25 не нужен.

Запуск

java -jar target/blog-1.0-SNAPSHOT.jar
... DefaultDeploymentConfiguration : Vaadin is running in production mode.
... TomcatWebServer : Tomcat started on port 8080 (http) with context path '/'
... Application     : Started Application in 17.777 seconds

Откройте http://localhost:8080 — та же админка, но без панели разработчика. JAR весит около 75 МБ: внутри Spring, Tomcat, Hibernate и все компоненты Vaadin. На сервере нужна только Java 21 или новее.

Настройки сервера

Значения из application.properties можно переопределить при запуске, не пересобирая JAR:

java -jar target/blog-1.0-SNAPSHOT.jar --server.port=9000
ЧтоКак задать
Порт--server.port=9000 или переменная PORT, если в настройках server.port=${PORT:8080}
База данныхSPRING_DATASOURCE_URL, SPRING_DATASOURCE_USERNAME, SPRING_DATASOURCE_PASSWORD
Профиль настроек--spring.profiles.active=prod и файл application-prod.properties

Для настоящей работы замените H2 на PostgreSQL: данные H2 в памяти исчезают при перезапуске. Пароли передавайте переменными окружения, а не храните в application.properties в Git.

За прокси

Обычно перед приложением стоит nginx с HTTPS. Vaadin работает через WebSocket (push), поэтому прокси должен пропускать заголовки Upgrade и Connection. Если серверов несколько, включите «липкие» сессии: состояние экранов хранится в памяти того сервера, где пользователь вошёл.

Частая ошибка

JAR запускают старой Java:

java.lang.UnsupportedClassVersionError: com/example/blog/Application has been compiled by a more recent version of the Java Runtime (class file version 69.0), this version of the Java Runtime only recognizes class file versions up to 61.0

Версия 69 — это Java 25, 61 — Java 17. Установите на сервер ту же версию Java, что указана в <java.version> в pom.xml, или новее.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.