У меня есть несколько файлов свойств, которые я хочу загрузить из пути к классам. Есть один набор по умолчанию, /src/main/resources
который является частью myapp.jar
. Я springcontext
ожидаю, что файлы будут в пути к классам. т.е.
<util:properties id="Job1Props"
location="classpath:job1.properties"></util:properties>
<util:properties id="Job2Props"
location="classpath:job2.properties"></util:properties>
Мне также нужна возможность переопределить эти свойства с помощью внешнего набора. У меня есть внешняя папка конфигурации cwd
. Согласно весенней папке конфигурации загрузочного документа должна быть в пути к классам. Но из документа не ясно, будет ли он отменять только applicaiton.properties
оттуда или все свойства в config.
Когда я его тестировал, он только application.properties
подбирается, а остальные свойства все еще подбираются /src/main/resources
. Я пытался предоставить их в виде списка, разделенного запятыми, spring.config.location
но набор по умолчанию все еще не отменяется.
Как сделать так, чтобы несколько внешних файлов конфигурации переопределяли файлы по умолчанию?
В качестве обходного пути я сейчас использовал app.config.location
(свойство приложения), которое я предоставляю через командную строку. т.е.
java -jar myapp.jar app.config.location=file:./config
и я изменил свой applicationcontext
на
<util:properties id="Job2Props"
location="{app.config.location}/job2.properties"></util:properties>
И вот как я разделяю файл и путь к классам при загрузке приложения.
правок:
//psuedo code
if (StringUtils.isBlank(app.config.location)) {
System.setProperty(APP_CONFIG_LOCATION, "classpath:");
}
Я действительно хотел бы не использовать вышеуказанный обходной путь и иметь Spring переопределить все внешние файлы конфигурации в пути к классам, как это делается для application.properties
файла.
application.properties
всегда будут загружаться, иspring.config.location
вы можете добавить дополнительные местоположения конфигурации, которые проверяются на наличие файлов (то есть, когда он заканчивается на a/
), однако, если вы поместите туда список, разделенный запятыми, который указывает на файлы, которые будут загружены. Это также объясняется в Справочном руководстве по Spring Boot здесьОтветы:
При использовании Spring Boot свойства загружаются в следующем порядке (см. Внешняя конфигурация в справочном руководстве Spring Boot).
При разрешении свойств (т.е.
@Value("${myprop}")
разрешение выполняется в обратном порядке (т.е. начиная с 9).Чтобы добавить разные файлы, вы можете использовать
spring.config.location
свойства, которые принимают список файлов свойств, разделенных запятыми, или расположение файла (каталоги).Вышеупомянутый добавит каталог, в котором будут запрашиваться
application.properties
файлы.Это добавит 2 файла свойств к загружаемым файлам.
Файлы конфигурации и местоположения по умолчанию загружаются перед дополнительными указанными
spring.config.location
, что означает, что последние всегда переопределяют свойства, установленные в более ранних. (См. Также этот раздел Справочного руководства по Spring Boot).ОБНОВЛЕНИЕ: поскольку поведение spring.config.location теперь переопределяет значение по умолчанию, а не добавляет к нему. Вам нужно использовать spring.config.additional-location, чтобы сохранить значения по умолчанию. Это изменение поведения с 1.x на 2.x
источник
application.properties
иapplication-[env].properties
. Не учитываются другие файлы свойств. Об этом также говорится в справочнике (в разделе, на который ведет ссылка, и цитате из справочника).config.location
и какconfig.names
взаимодействовать, хотя, вероятно, кажется понятным людям, которые уже знают, как они взаимодействуют. Можете ли вы обновить свой ответ, чтобы добавить что-нибудь в документацию?spring.config.location
now переопределяет значение по умолчанию, а не добавляется к нему. Вам нужно использовать,spring.config.additional-location
чтобы сохранить значения по умолчанию. Это изменение поведения с 1.x на 2.x.При загрузке Spring Spring.config.location действительно работает, просто предоставьте файлы свойств, разделенные запятыми.
см. код ниже
можно поместить в приложение версию jdbc.properties по умолчанию. На этом можно установить внешние версии.
На основе значения профиля, установленного с помощью свойства spring.profiles.active, будет выбрано значение jdbc.host. Итак, когда (в окнах)
jdbc.host будет принимать значение из jdbc-dev.properties.
для
jdbc.host будет принимать значение из jdbc.properties.
источник
Spring boot 1.X и Spring Boot 2.X не предоставляют те же параметры и поведение, что и
Externalized Configuration
.Очень хороший ответ М. Дейнума относится к особенностям Spring Boot 1.
Я обновлюсь до Spring Boot 2 здесь.
Источники и порядок свойств среды
Spring Boot 2 использует очень особый
PropertySource
порядок, который предназначен для разумного переопределения значений. Свойства рассматриваются в следующем порядке:Чтобы указать файлы внешних свойств, эти параметры должны вас заинтересовать:
Вы можете использовать только один из этих 3 вариантов или комбинировать их в соответствии с вашими требованиями.
Например, для очень простых случаев достаточно использовать только свойства, специфичные для профиля, но в других случаях вы можете использовать как свойства, специфичные для профиля, свойства по умолчанию и
@PropertySource
.Расположение по умолчанию для файлов application.properties
Что
application.properties
касается файлов (и варианта), по умолчанию Spring загружает их и добавляет их свойства в среду из них в следующем порядке:Высшие приоритеты так буквально:
classpath:/,classpath:/config/,file:./,file:./config/
.Как использовать файлы свойств с определенными именами?
Места по умолчанию не всегда достаточно: места по умолчанию, такие как имя файла по умолчанию (
application.properties
), могут не подходить. Кроме того, как и в вопросе OP, вам может потребоваться указать несколько файлов конфигурации, кромеapplication.properties
(и варианта).Так
spring.config.name
что будет мало.В этом случае вы должны указать точное местоположение с помощью
spring.config.location
свойства среды (которое представляет собой список разделенных запятыми местоположений каталогов или путей к файлам).Чтобы не беспокоиться о шаблоне имен файлов, предпочтите список путей к файлам списку каталогов.
Например, вот так:
Это наиболее подробный способ указания папки, но это также способ очень точно указать наши файлы конфигурации и четко задокументировать эффективно используемые свойства.
spring.config.location теперь заменяет местоположения по умолчанию, а не добавляет к ним
В Spring Boot 1
spring.config.location
аргумент добавляет указанные местоположения в среду Spring.Но из Spring Boot 2
spring.config.location
заменяет местоположения по умолчанию, используемые Spring, указанными местоположениями в среде Spring, как указано в документации .spring.config.location
теперь способ убедиться, что любойapplication.properties
файл должен быть явно указан.Для uber JAR, которые не должны упаковывать
application.properties
файлы, это довольно приятно.Чтобы сохранить старое поведение
spring.config.location
при использовании Spring Boot 2, вы можете использовать новоеspring.config.additional-location
свойство вместо этого,spring.config.location
которое по-прежнему добавляет местоположения, как указано в документации :На практике
Итак, предположим, что, как и в вопросе OP, у вас есть 2 файла внешних свойств для указания и 1 файл свойств, включенный в uber jar.
Чтобы использовать только указанные вами файлы конфигурации:
Чтобы добавить файлы конфигурации к ним в расположение по умолчанию:
classpath:/applications.properties
в последнем примере не требуется, поскольку он есть в расположениях по умолчанию, и эти расположения по умолчанию здесь не перезаписываются, а расширяются.источник
application.properties
со всеми параметрами и несколько${file_name}.properties
с частично определенными наборами свойств. Итак, если вы используете@PropertySource
или другие надежные ссылки на файлы, вы можете создать другой внешний файл и переопределить эти свойства (например, изclasspath:file.properties
).Взгляните на PropertyPlaceholderConfigurer, я считаю, что использовать его проще, чем аннотацию.
например
источник
это один простой подход с использованием пружинной загрузки
TestClass.java
app.properties контекст, в вашем выбранном месте
ваше приложение для весенней загрузки
и предопределенный контекст application.properties
вы можете написать столько классов конфигурации, сколько захотите, и включить / отключить их, просто установив spring.profiles.active = имя / имена профиля {разделенные запятыми}
поскольку вы можете видеть, что весенняя загрузка - это здорово, просто нужно время, чтобы познакомиться, стоит упомянуть, что вы также можете использовать @Value в своих полях
источник
У меня такая же проблема. Я хотел иметь возможность перезаписывать внутренний файл конфигурации при запуске внешним файлом, как при обнаружении Spring Boot application.properties. В моем случае это файл user.properties, в котором хранятся пользователи моих приложений.
Мои требования:
Загрузите файл из следующих мест (в этом порядке)
Я пришел к следующему решению:
Теперь приложение использует ресурс пути к классам, но также проверяет наличие ресурса в других заданных местах. Будет выбран и использован последний существующий ресурс. Я могу запустить свое приложение с помощью java -jar myapp.jar --properties.location = / directory / myproperties.properties, чтобы использовать местоположение свойств, в котором плавает моя лодка.
Важная деталь: используйте пустую строку в качестве значения по умолчанию для свойства .location в аннотации @Value, чтобы избежать ошибок, когда свойство не установлено.
Соглашение для properties.location следующее: Используйте каталог или путь к файлу свойств как properties.location.
Если вы хотите переопределить только определенные свойства, можно использовать PropertiesFactoryBean с setIgnoreResourceNotFound (true) с массивом ресурсов, установленным в качестве местоположений.
Я уверен, что это решение можно расширить для обработки нескольких файлов ...
РЕДАКТИРОВАТЬ
Вот мое решение для нескольких файлов :) Как и раньше, это можно комбинировать с PropertiesFactoryBean.
источник
Spring boot позволяет нам писать разные профили для записи для разных сред, например, у нас могут быть отдельные файлы свойств для производственных, qa и локальных сред
application-local.properties файл с конфигурациями в соответствии с моей локальной машиной
Точно так же мы можем написать application-prod.properties и application-qa.properties столько файлов свойств, сколько захотим.
затем напишите несколько сценариев для запуска приложения для разных сред, например
источник
У меня только что была похожая проблема, и я, наконец, выяснил причину: файл application.properties имел неправильное владение и атрибуты rwx. Итак, когда tomcat запустил файл application.properties, он находился в нужном месте, но принадлежал другому пользователю:
источник
Модифицированная версия решения @mxsb, которая позволяет нам определять несколько файлов, и в моем случае это файлы yml.
В моем application-dev.yml я добавил эту конфигурацию, которая позволяет мне вводить все yml, в которых есть -dev.yml. Это также может быть список определенных файлов. "Путь к классам: /test/test.yml,classpath: /test2/test.yml"
Это помогает получить карту свойств.
Однако, как и в моем случае, я хотел разделить файлы yml для каждого профиля, загрузить их и внедрить их непосредственно в конфигурацию Spring перед инициализацией beans.
... вы поняли
Компонент немного другой
}
источник
Если вы хотите переопределить значения, указанные в файле application.properties, вы можете изменить свой активный профиль при запуске приложения и создать файл свойств приложения для профиля. Так, например, давайте укажем активный профиль «override», а затем, предполагая, что вы создали свой новый файл свойств приложения с именем «application-override.properties» в / tmp, вы можете запустить
Значения, указанные в spring.config.location, оцениваются в обратном порядке. Итак, в моем примере сначала оценивается classpat, а затем значение файла.
Если файл jar и файл application-override.properties находятся в текущем каталоге, вы можете просто использовать
поскольку Spring Boot найдет для вас файл свойств
источник
Я обнаружил, что это полезный образец для подражания:
Здесь мы отменяем использование application.yml, чтобы использовать application-MyTest_LowerImportance.yml, а также application-MyTest_MostImportant.yml
(Spring также будет искать файлы .properties).
Также в качестве дополнительного бонуса включены настройки отладки и трассировки в отдельной строке, так что вы можете закомментировать их при необходимости;]
Отладка / трассировка невероятно полезны, так как Spring сбрасывает имена всех файлов, которые он загружает, и тех, которые он пытается загрузить.
Вы увидите такие строки в консоли во время выполнения:
источник
Я столкнулся с множеством проблем, пытаясь понять это. Вот моя установка,
Dev Env: Windows 10, Java: 1.8.0_25, Spring Boot: 2.0.3.RELEASE, Spring: 5.0.7.RELEASE
Я обнаружил, что Spring придерживается концепции «Разумные настройки по умолчанию для конфигурации». Это означает, что все ваши файлы свойств должны быть частью вашего файла войны. Оказавшись там, вы можете переопределить их, используя свойство командной строки "--spring.config.additional-location", чтобы указать на внешние файлы свойств. Но это НЕ РАБОТАЕТ, если файлы свойств не являются частью исходного файла war.
Демо-код: https://github.com/gselvara/spring-boot-property-demo/tree/master
источник