powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Активация профиля application.properties в зависимости от среды запуска
28 сообщений из 28, показаны все 2 страниц
Активация профиля application.properties в зависимости от среды запуска
    #40021538
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приложение разрабатывается и тестируется на хосте под 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
Активация профиля application.properties в зависимости от среды запуска
    #40021758
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
Активация профиля application.properties в зависимости от среды запуска
    #40021760
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Активация профиля application.properties в зависимости от среды запуска
    #40021766
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Активация профиля application.properties в зависимости от среды запуска
    #40021770
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Активация профиля application.properties в зависимости от среды запуска
    #40021775
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Активация профиля application.properties в зависимости от среды запуска
    #40021784
Псевдомизантроп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Активация профиля application.properties в зависимости от среды запуска
    #40021811
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я запускаю из командной строки.

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


Не понял вас, мне не дает в properties прописать автор-D - синтаксическая ошибка.
...
Рейтинг: 0 / 0
Активация профиля application.properties в зависимости от среды запуска
    #40021825
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Активация профиля application.properties в зависимости от среды запуска
    #40021841
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прибереги восклицательные знаки Еще понадобятся.
...
Рейтинг: 0 / 0
Активация профиля application.properties в зависимости от среды запуска
    #40021857
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Прибереги восклицательные знаки Еще понадобятся.

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

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

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


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

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

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



то что за файлы с настройками мы здесь грузим?
Код: java
1.
2.
        //Дозагружаем файлы с настройками
        new ConfigFileApplicationListener().postProcessEnvironment(context.getEnvironment(), application);
...
Рейтинг: 0 / 0
Активация профиля application.properties в зависимости от среды запуска
    #40024333
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Активация профиля application.properties в зависимости от среды запуска
    #40024475
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lelouch,
Lelouch1) Метод initialize вызывается в процессе старта SpringApplication

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


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

Внутри себя создает?)
На данный момент я настолько глубоко в процесс загрузки спринга не залезал (ибо не требовалось)
...
Рейтинг: 0 / 0
Активация профиля application.properties в зависимости от среды запуска
    #40025945
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lelouch
Vlad__i__mir
Lelouch,
пропущено...


А параметр пропущено...
для метода initialize Spring где берет?


Внутри себя создает?)
На данный момент я настолько глубоко в процесс загрузки спринга не залезал (ибо не требовалось)


Наверное, если это работает )

Спасибо!
...
Рейтинг: 0 / 0
Активация профиля application.properties в зависимости от среды запуска
    #40026228
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouch

2) Проблема в том, что загрузка файлов настроек происходит до ApplicationContextInitializer, и для дозагрузки новый файлов, активированных добавлением профиля нужно вызвать listener еще раз. Скорее всего можно преобразовать ApplicationContextInitializer в ApplicationListener и добиться того, чтобы он отработал до первого вызова ConfigFileApplicationListener, но мне на данный момент лень с этим копаться


вся магия с окружением у бута происходит в META-INF/spring.factories:

Код: java
1.
2.
3.
4.
5.
6.
# Environment Post Processors
org.springframework.boot.env.EnvironmentPostProcessor=\
org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,\
org.springframework.boot.env.SpringApplicationJsonEnvironmentPostProcessor,\
org.springframework.boot.env.SystemEnvironmentPropertySourceEnvironmentPostProcessor,\
org.springframework.boot.reactor.DebugAgentEnvironmentPostProcessor



т.е. достаточно свой постпроцессор написать и определить его в META-INF/spring.factories
...
Рейтинг: 0 / 0
Активация профиля application.properties в зависимости от среды запуска
    #40026443
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
Lelouch

2) Проблема в том, что загрузка файлов настроек происходит до ApplicationContextInitializer, и для дозагрузки новый файлов, активированных добавлением профиля нужно вызвать listener еще раз. Скорее всего можно преобразовать ApplicationContextInitializer в ApplicationListener и добиться того, чтобы он отработал до первого вызова ConfigFileApplicationListener, но мне на данный момент лень с этим копаться


вся магия с окружением у бута происходит в META-INF/spring.factories:

Код: java
1.
2.
3.
4.
5.
6.
# Environment Post Processors
org.springframework.boot.env.EnvironmentPostProcessor=\
org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,\
org.springframework.boot.env.SpringApplicationJsonEnvironmentPostProcessor,\
org.springframework.boot.env.SystemEnvironmentPropertySourceEnvironmentPostProcessor,\
org.springframework.boot.reactor.DebugAgentEnvironmentPostProcessor



т.е. достаточно свой постпроцессор написать и определить его в META-INF/spring.factories


Cпасибо, посмотрю)

P.S. Я вспомнил, почему у меня это в Initializer - у меня есть настройка, которая эту логику отключает
То есть мне сначала нужно получить текущий environment, проверить значение настройки и только после этого профили добавить
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Активация профиля application.properties в зависимости от среды запуска
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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