Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Активация профиля application.properties в зависимости от среды запуска / 25 сообщений из 28, страница 1 из 2
23.11.2020, 21:19
    #40021538
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Приложение разрабатывается и тестируется на хосте под Windows и должно запускаться в контейнере Docker.
Соответственно в Docker-compose запускается отдельный сервис с БД, параметры подключения к которому отличаются от параметров подключения на хосте под Windows. Чтобы решить проблему запуска приложения с разными параметрами в разных средах был найден следующий способ. Прописываем переменные среды в файле Docker-compose:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
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 :
Код: java
1.
2.
spring.config.name=application
spring.profiles.active=${SPRING_PROFILES_ACTIVE:application-local.properties}



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


Код: java
1.
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 :

Код: java
1.
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 идет не как планировалось.

В чем ошибка, что неверно сделал?
...
Рейтинг: 0 / 0
24.11.2020, 15:11
    #40021758
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Vlad__i__mir,

Я делаю через maven

В pom.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
...
    <profiles>
        <profile>
            <id>test</id>
            <properties>
                <activatedProperties>test</activatedProperties>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <activatedProperties>prod</activatedProperties>
            </properties>
        </profile>
    </profiles>

...



Создаю три properties файла

application.properties
Код: xml
1.
spring.profiles.active=@activatedProperties@



application-prod.properties - здесь все настройки для прода
application-test.properties - здесь все настройки для теста

Сборка для теста
Код: powershell
1.
mvn clean install -P test



Сборка для прода
Код: powershell
1.
mvn clean install -P prod



Можно ещё посмотреть в сторону Spring cloud
...
Рейтинг: 0 / 0
24.11.2020, 15:25
    #40021760
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Vlad__i__mir

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


Можно ссылку на доку, откуда Вы взяли, что java properties что-то знает о переменных среды?
Возможно, конечно, я отстал от жизни. Но спросил у гугля - он тоже не знает.

https://docs.oracle.com/javase/7/docs/api/java/util/Properties.html#load(java.io.Reader)
...
Рейтинг: 0 / 0
24.11.2020, 15:50
    #40021766
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
...
Рейтинг: 0 / 0
24.11.2020, 15:54
    #40021770
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
mad_nazgul
Vlad__i__mir,

Я делаю через maven

В pom.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
...
    <profiles>
        <profile>
            <id>test</id>
            <properties>
                <activatedProperties>test</activatedProperties>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <activatedProperties>prod</activatedProperties>
            </properties>
        </profile>
    </profiles>

...



Создаю три properties файла

application.properties
Код: xml
1.
spring.profiles.active=@activatedProperties@



application-prod.properties - здесь все настройки для прода
application-test.properties - здесь все настройки для теста

Сборка для теста
Код: powershell
1.
mvn clean install -P test



Сборка для прода
Код: powershell
1.
mvn clean install -P prod



Можно ещё посмотреть в сторону Spring cloud


Вариант, если не получится довести до ума тот что сейчас пытаюсь, то попробую. Но все-таки хочется понять, что не так в моем примере
...
Рейтинг: 0 / 0
24.11.2020, 16:11
    #40021775
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
IMHO НЕ специалиста по spring

Мне кажется, сначала упростить задачу т.е. без "или дефолтное значение, если данная переменная не определена", если не поможет то и без "Profiles"

Т.к. для Subj вполне достаточно

If you do not like application as the configuration file name, you can switch to another file name by specifying a spring.config.name environment property. You can also refer to an explicit location by using the spring.config.location environment property (which is a comma-separated list of directory locations or file paths). The following example shows how to specify a different file name:

$ java -jar myproject.jar --spring.config.name=myproject
...
Рейтинг: 0 / 0
24.11.2020, 16:39
    #40021784
Псевдомизантроп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Vlad__i__mir


1) тот, что должен грузиться 1-ым и из которого мы берем данные какой файл properties нам нужно будет использовать, в нем же прописываем и какой дефолтный - application.properties :
Код: java
1.
2.
spring.config.name=application
spring.profiles.active=${SPRING_PROFILES_ACTIVE:application-local.properties}




в spring.profiles.active должно же быть имя профиля(ей), а не имя файла?
...
Рейтинг: 0 / 0
24.11.2020, 18:05
    #40021811
Valentin Kolesnikov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Я запускаю из командной строки.

mvn spring-boot:run -Drun.jvmArguments='-Dspring.config.location=classpath:/application-local.properties'
...
Рейтинг: 0 / 0
24.11.2020, 18:27
    #40021817
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Vlad__i__mir
читал в нескольких источниках
Смотрим в книгу?...
Код: plaintext
 java ... -Dсвойство=${переменная} ...
означает, что оболочка, обрабатывающая командную строку подставляет значение переменной (окружения).
И такой синтаксис - фишка POSIX-shell. Как и разница между переменной и переменной окружения.
...
Рейтинг: 0 / 0
24.11.2020, 18:46
    #40021820
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Псевдомизантроп
Vlad__i__mir


1) тот, что должен грузиться 1-ым и из которого мы берем данные какой файл properties нам нужно будет использовать, в нем же прописываем и какой дефолтный - application.properties :
Код: java
1.
2.
spring.config.name=application
spring.profiles.active=${SPRING_PROFILES_ACTIVE:application-local.properties}




в spring.profiles.active должно же быть имя профиля(ей), а не имя файла?


Пробовал и так
Код: java
1.
2.
spring.config.name=application
spring.profiles.active=${SPRING_PROFILES_ACTIVE:application-local}



результат тотже
...
Рейтинг: 0 / 0
24.11.2020, 18:55
    #40021821
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Если я правильно понимаю буквы в документации, имя профиля "local", а дальше Spring сам имя соберет:

2.3.3. Profile Specific Files
As well as application property files, Spring Boot will also attempt to load profile-specific files using the naming convention application-{profile}. For example, if your application activates a profile named prod and uses YAML files, then both application.yml and application-prod.yml will be considered.
...
Рейтинг: 0 / 0
24.11.2020, 18:56
    #40021823
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Basil A. Sidorov
Vlad__i__mir
читал в нескольких источниках
Смотрим в книгу?...
Код: plaintext
 java ... -Dсвойство=${переменная} ...
означает, что оболочка, обрабатывающая командную строку подставляет значение переменной (окружения).
И такой синтаксис - фишка POSIX-shell. Как и разница между переменной и переменной окружения.


Не понял вас, мне не дает в properties прописать автор-D - синтаксическая ошибка.
...
Рейтинг: 0 / 0
24.11.2020, 19:02
    #40021825
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Leonid Kudryavtsev
Если я правильно понимаю буквы в документации, имя профиля "local", а дальше Spring сам имя соберет:

2.3.3. Profile Specific Files
As well as application property files, Spring Boot will also attempt to load profile-specific files using the naming convention application-{profile}. For example, if your application activates a profile named prod and uses YAML files, then both application.yml and application-prod.yml will be considered.


Гениально!!! Вы правы! Заработало. Спасибо!
...
Рейтинг: 0 / 0
24.11.2020, 19:43
    #40021841
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Прибереги восклицательные знаки Еще понадобятся.
...
Рейтинг: 0 / 0
24.11.2020, 21:19
    #40021857
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
mayton
Прибереги восклицательные знаки Еще понадобятся.

Это да. Я пока на локалке протестировал, в контейнер ещё не деплоил )
...
Рейтинг: 0 / 0
26.11.2020, 06:08
    #40022329
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Zzz79
Vlad__i__mir
пропущено...

Это да. Я пока на локалке протестировал, в контейнер ещё не деплоил )

занимаешься куйней,в норм конторах это делают девопсы


Вообще то по практике devops docker файл пишет программист.
DevOps только pipline для CI/CD настраивает и поддерживает.
:-)
...
Рейтинг: 0 / 0
26.11.2020, 09:30
    #40022352
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Vlad__i__mir,

Я вот таким способом варьирую список профилей в зависимости от OS:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
private static final class ProfilesInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    private final SpringApplication application;

    
    ProfilesInitializer(@NotNull final SpringApplication application) {
        this.application = application;
    }

    @Override
    public void initialize(@NotNull final ConfigurableApplicationContext context) {
        String profile = null;
        if (SystemUtils.IS_OS_LINUX
                || SystemUtils.IS_OS_AIX
                || SystemUtils.IS_OS_FREE_BSD) {
            profile = "unix";
        }
        if (SystemUtils.IS_OS_WINDOWS) {
            profile = "windows";
        }
        if (SystemUtils.IS_OS_MAC) {
            profile = "mac";
        }

        //Активируем дополнительный профиль
        context.getEnvironment().addActiveProfile(profile);
       
        //Дозагружаем файлы с настройками
        new ConfigFileApplicationListener().postProcessEnvironment(context.getEnvironment(), application);
    }
}

//Применение:
public static void main(final String... args) {
    setDefaultProperties();

    application.addInitializers(
            new ProfilesInitializer(application));
    application.run(args);
}



Это позволяет загружать дополнительный файл настроек application-[os-profile].properties
...
Рейтинг: 0 / 0
26.11.2020, 09:42
    #40022356
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Lelouch,

Черт, не проснулся и подумал, что вопрос в активации профилей в зависимости от OS.
...
Рейтинг: 0 / 0
27.11.2020, 17:38
    #40022846
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Zzz79, так я же не в конторе, я ВКР делаю ) Хочу чтобы когда все было готово не парится с настройками на хостинге - просто залить и запустить
...
Рейтинг: 0 / 0
27.11.2020, 17:47
    #40022849
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Lelouch, что за переменная application?
...
Рейтинг: 0 / 0
28.11.2020, 01:14
    #40022923
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
...
Рейтинг: 0 / 0
29.11.2020, 21:26
    #40023210
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Lelouch,
а где и как вызывается метод initialize ?

Если мы здесь уже активировали нужный профиль:
Код: java
1.
2.
//Активируем дополнительный профиль
        context.getEnvironment().addActiveProfile(profile);



то что за файлы с настройками мы здесь грузим?
Код: java
1.
2.
        //Дозагружаем файлы с настройками
        new ConfigFileApplicationListener().postProcessEnvironment(context.getEnvironment(), application);
...
Рейтинг: 0 / 0
03.12.2020, 19:05
    #40024333
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Vlad__i__mir
Lelouch,
а где и как вызывается метод initialize ?

Если мы здесь уже активировали нужный профиль:
Код: java
1.
2.
//Активируем дополнительный профиль
        context.getEnvironment().addActiveProfile(profile);



то что за файлы с настройками мы здесь грузим?
Код: java
1.
2.
        //Дозагружаем файлы с настройками
        new ConfigFileApplicationListener().postProcessEnvironment(context.getEnvironment(), application);



1) Метод initialize вызывается в процессе старта SpringApplication
2) Проблема в том, что загрузка файлов настроек происходит до ApplicationContextInitializer, и для дозагрузки новый файлов, активированных добавлением профиля нужно вызвать listener еще раз. Скорее всего можно преобразовать ApplicationContextInitializer в ApplicationListener и добиться того, чтобы он отработал до первого вызова ConfigFileApplicationListener, но мне на данный момент лень с этим копаться
...
Рейтинг: 0 / 0
04.12.2020, 10:37
    #40024475
Vlad__i__mir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Lelouch,
Lelouch1) Метод initialize вызывается в процессе старта SpringApplication

А параметр авторConfigurableApplicationContext context для метода initialize Spring где берет?
...
Рейтинг: 0 / 0
04.12.2020, 13:25
    #40024577
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Активация профиля application.properties в зависимости от среды запуска
Vlad__i__mir
Lelouch,
Lelouch1) Метод initialize вызывается в процессе старта SpringApplication


А параметр авторConfigurableApplicationContext context для метода initialize Spring где берет?

Внутри себя создает?)
На данный момент я настолько глубоко в процесс загрузки спринга не залезал (ибо не требовалось)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Активация профиля application.properties в зависимости от среды запуска / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]