Encodera

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

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

Оглавление

Сборка JAR и запуск на сервере

На сервер не копируют исходники и не запускают ./mvnw spring-boot:run. Приложение собирают в один исполняемый JAR-файл: внутри ваш код, все библиотеки и встроенный Tomcat. На сервере нужна только Java 25 — и одна команда для запуска.

Сборка

./mvnw clean package

Maven скомпилирует код, прогонит тесты и соберёт файл в папке target:

target/blog-0.0.1-SNAPSHOT.jar           64 МБ — для запуска
target/blog-0.0.1-SNAPSHOT.jar.original  40 КБ — только ваши классы

Большой файл собрал spring-boot-maven-plugin: он упаковал внутрь все зависимости. Файл .original — обычный JAR без библиотек, на сервер его не берут. Если тесты упали, JAR не соберётся; пропустить их можно ключом -DskipTests, но лучше починить.

Запуск

java -jar target/blog-0.0.1-SNAPSHOT.jar

В журнале — те же строки, что при запуске через Maven. Остановить приложение можно Ctrl+C; на сервере его обычно запускают как службу systemd или в контейнере, чтобы оно поднималось само после перезагрузки.

Настройки для сервера

Для сервера заведём профиль prod. В нём нет паролей — только то, что отличается от разработки:

# src/main/resources/application-prod.yaml
spring:
  jpa:
    show-sql: false
  h2:
    console:
      enabled: false
 
logging:
  file:
    name: logs/blog.log

Адрес и пароль базы передаются переменными окружения при запуске:

SPRING_PROFILES_ACTIVE=prod \
SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/blog \
SPRING_DATASOURCE_USERNAME=blog \
SPRING_DATASOURCE_PASSWORD=changeme \
java -jar target/blog-0.0.1-SNAPSHOT.jar

Spring Boot сам превращает SPRING_DATASOURCE_URL в настройку spring.datasource.url — переписывать файлы на сервере не нужно. Для PostgreSQL в pom.xml должны быть драйвер org.postgresql:postgresql и модуль flyway-database-postgresql.

Что видно при запуске

INFO ... The following 1 profile is active: "prod"
INFO ... Database: jdbc:postgresql://localhost:5432/blog (PostgreSQL 18.3)
INFO ... Migrating schema "public" to version "1 - create tables"
INFO ... Migrating schema "public" to version "2 - add password and role"
INFO ... Successfully applied 2 migrations to schema "public", now at version v2

На пустой базе PostgreSQL Flyway применил обе миграции — те же файлы, что работали с H2. Затем curl http://localhost:8080/actuator/health ответит со статусом UP, а журнал продублируется в logs/blog.log.

Список перед выкладкой

Что проверитьКак
Профиль prod включёнСтрока The following 1 profile is active: "prod"
Пароли не лежат в GitТолько переменные окружения
Консоль H2 выключенаspring.h2.console.enabled: false
Схема ведётся миграциямиddl-auto: validate и Flyway
Есть проверка здоровья/actuator/health отвечает UP

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

Если запустить не тот файл, Java ответит:

no main manifest attribute, in target\blog-0.0.1-SNAPSHOT.jar.original

Это файл .original без библиотек и без точки входа. Запускайте JAR без этого окончания. Та же ошибка бывает, если в pom.xml нет spring-boot-maven-plugin: тогда большой исполняемый файл вообще не собирается.

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

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