Активация профиля application.properties в зависимости от среды запуска

241
22 июня 2022, 16:20

Приложение разрабатывается и тестируется на хосте под Windows и должно запускаться в контейнере Docker. Соответственно в Docker-compose запускается отдельный сервис с БД, параметры подключения к которому отличаются от параметров подключения на хосте под Windows. Чтобы решить проблему запуска приложения с разными параметрами в разных средах был найден следующий способ. Прописываем переменные среды в файле Docker-compose:

services:
 
  authorizationService:
    image: tomcat  
    volumes:
        - E:\Authorization_service_prjct\war_arсhive:/usr/local/tomcat/webapps
    environment:
        - SPRING_PROFILES_ACTIVE: application-server 
        - SPRING_DATASOURCE_URL: jdbc:mysql://database:3306/db_users?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC
        - DB_USER: root
        - DB_PASSWORD: root
    ports:
        - "8888:8080"
    links:
        - "database:db_users"
  
  database:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
        MYSQL_ROOT_USER: root
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: db_users
    ports:
      # <Port exposed> : < MySQL Port running inside container>
      - '3316:3306'
    expose:
      # Opens port 3306 on the container
      - '3306'

Создаем 3 файла профиля properties:

  1. тот, что должен грузиться 1-ым и из которого мы берем данные какой файл properties нам нужно будет использовать, в нем же прописываем и какой дефолтный - application.properties:

    spring.config.name=application spring.profiles.active=${SPRING_PROFILES_ACTIVE:application-local.properties}

  2. файл properties с настройками для контейнера Docker - application-server.properties:

    spring.config.name=application-server spring.datasource.url=${SPRING_DATASOURCE_URL} spring.datasource.username=${DB_USER} spring.datasource.password=${DB_PASSWORD} spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.show-sql=true spring.jpa.generate-ddl=false spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect

  3. файл properties с настройками для локального сервера - application-local.properties:

    spring.config.name=application-local spring.datasource.url=jdbc:mysql://localhost:3306/db_users?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.show-sql=true spring.jpa.generate-ddl=false spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect

По идее должно работать следующим образом:

  1. грузится файл application.properties
  2. параметру spring.profiles.active присваивается значение переменной среды SPRING_PROFILES_ACTIVE или дефолтное значение, если данная переменная не определена
  3. по свойству spring.profiles.active определяется какой должен использоваться файл properties

Но тест запуска на локалке выдал ошибку с загрузкой Datasourse:

Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProper ties$DataSourceBeanCreationException: Failed to determine a suitable driver class at org.springframework.boot.autoconfigure.jdbc.DataSourceProper ties.determineDriverClassName(DataSourceProperties.java:234) at org.springframework.boot.autoconfigure.jdbc.DataSourceProper ties.initializeDataSourceBuilder(DataSourceProperties.java:1 75) at org.springframework.boot.autoconfigure.jdbc.DataSourceConfig uration.createDataSource(DataSourceConfiguration.java:43) at org.springframework.boot.autoconfigure.jdbc.DataSourceConfig uration$Hikari.dataSource(DataSourceConfiguration.java:85) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeM ethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Del egatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.beans.factory.support.SimpleInstantiatio nStrategy.instantiate(SimpleInstantiationStrategy.java:154) ... 88 more

Т.е. не работает - загрузка файлов properties идет не как планировалось.

В чем ошибка, что я неверно понял?

Answer 1

Я думаю, что проблема в неправильном значении параметра spring.profiles.active. Он принимает название профиля (local, server), а не файла или части файла. Вот как должно быть:

environment:
    - SPRING_PROFILES_ACTIVE: server

и

spring.profiles.active=${SPRING_PROFILES_ACTIVE:local}
READ ALSO
Cравнение строк

Cравнение строк

C клавиатуры вводится "Hello", по почему-то выдает false,хотя вроде бы строки равны

269
Разница между Chronometer и CountDownTimer

Разница между Chronometer и CountDownTimer

Создаю приложение, которое каждый день даёт заданияЗадание даётся раз в 24 часа

310
Как заполнить массив double через цикл for?

Как заполнить массив double через цикл for?

Для вывода трёхмерного пространства необходимо таким образом заполнить массив, вроде как лёгкое дело, но мне в районе x[i],y[j],z[i][j] выводит ошибку:

173
Потокобезопасность HashMap в Java

Потокобезопасность HashMap в Java

Встречал много статей, где предлагают как вполне возможный вариант использовать javautil

222