Spring Boot и несколько внешних файлов конфигурации
У меня есть несколько файлов свойств, которые я хочу загрузить из classpath. Существует один набор по умолчанию под /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
, В соответствии с весенним каталогом boot doc config папка должна быть в classpath. Но это не ясно из документа, если он будет только перекрывать applicaiton.properties
оттуда или все свойства в конфигурации.
Когда я проверял это, только 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>
И вот как я делаю разделение между файлом и classpath при загрузке приложения.
редактирует:
//psuedo code
if (StringUtils.isBlank(app.config.location)) {
System.setProperty(APP_CONFIG_LOCATION, "classpath:");
}
Я действительно хотел бы не использовать вышеупомянутый обходной путь и иметь весеннее переопределение всех внешних файлов конфигурации на пути к классам, как это делает для application.properties
файл.
13 ответов
При использовании Spring Boot свойства загружаются в следующем порядке (см. Внешняя конфигурация в справочном руководстве Spring Boot).
- Аргументы командной строки.
- Свойства системы Java (System.getProperties()).
- Переменные среды ОС.
- Атрибуты JNDI из Java:comp/env
- RandomValuePropertySource, который имеет свойства только в случайном порядке.*.
- Свойства приложения вне вашего упакованного фляги (application.properties, включая YAML и варианты профиля).
- Свойства приложения, упакованные в вашем фляге (application.properties, включая YAML и варианты профиля).
- Аннотации @PropertySource для ваших классов @Configuration.
- Свойства по умолчанию (задаются с помощью SpringApplication.setDefaultProperties).
При разрешении свойств (т.е. @Value("${myprop}")
разрешение выполняется в обратном порядке (начиная с 9).
Чтобы добавить разные файлы, вы можете использовать spring.config.location
свойства, которые принимают разделенный запятыми список файлов свойств или расположение файла (каталоги).
-Dspring.config.location=your/config/dir/
Приведенный выше добавит каталог, к которому будут обращаться application.properties
файлы.
-Dspring.config.location=classpath:job1.properties,classpath:job2.properties
Это добавит файл 2 свойств к загруженным файлам.
Конфигурационные файлы и местоположения по умолчанию загружаются до указанного spring.config.location
означающие, что последний всегда будет переопределять свойства, установленные в предыдущих. (См. Также этот раздел справочного руководства Spring Boot).
Если
spring.config.location
содержит каталоги (в отличие от файлов) они должны заканчиваться на / (и будут дополнены именами, сгенерированными изspring.config.name
перед загрузкой). Путь поиска по умолчаниюclasspath:,classpath:/config,file:,file:config/
всегда используется, независимо от значенияspring.config.location
, Таким образом, вы можете установить значения по умолчанию для вашего приложения вapplication.properties
(или любое другое базовое имя, которое вы выберетеspring.config.name
) и переопределить его во время выполнения другим файлом, сохраняя настройки по умолчанию.
При загрузке Spring, spring.config.location работает, просто предоставьте запятые файлы свойств.
см. код ниже
@PropertySource(ignoreResourceNotFound=true,value="classpath:jdbc-${spring.profiles.active}.properties")
public class DBConfig{
@Value("${jdbc.host}")
private String jdbcHostName;
}
}
внутри приложения можно установить версию jdbc.properties по умолчанию. Внешние версии могут быть установлены так.
java -jar target/myapp.jar --spring.config.location=classpath:file:///C:/Apps/springtest/jdbc.properties,classpath:file:///C:/Apps/springtest/jdbc-dev.properties
На основе значения профиля, установленного с помощью свойства spring.profiles.active, будет выбрано значение jdbc.host. Так когда (на окнах)
set spring.profiles.active=dev
jdbc.host примет значение из jdbc-dev.properties.
за
set spring.profiles.active=default
jdbc.host примет значение от jdbc.properties.
Spring boot 1.X и Spring Boot 2.X не предоставляют одинаковые параметры и поведение Externalized Configuration
,
Очень хороший ответ M. Deinum относится к особенностям Spring Boot 1.
Я буду обновлять для Spring Boot 2 здесь.
Источники и порядок свойств среды
Spring Boot 2 использует очень специфический PropertySource
порядок, предназначенный для разумного переопределения значений. Свойства рассматриваются в следующем порядке:
Свойства глобальных настроек Devtools в вашем домашнем каталоге (~/.spring-boot-devtools.properties, когда devtools активен).
@TestPropertySource
аннотации на ваших тестах.
@SpringBootTest#properties
атрибут аннотации в ваших тестах. Аргументы командной строки.Свойства от
SPRING_APPLICATION_JSON
(встроенный JSON, встроенный в переменную окружения или системное свойство).
ServletConfig
Параметры инициализации.
ServletContext
Параметры инициализации.Атрибуты JNDI из
java:comp/env
,Свойства системы Java (
System.getProperties()
).Переменные среды ОС.
RandomValuePropertySource
который имеет свойства только в случайном порядке.*.Специфичные для профиля свойства приложения за пределами вашего упакованного фляги (
application-{profile}.properties
и варианты YAML).Профильные свойства приложения, упакованные внутри вашего фляги (
application-{profile}.properties
и варианты YAML).Свойства приложения за пределами вашей упакованной банки (
application.properties
и варианты YAML).Свойства приложения, упакованные внутри вашей банки (
application.properties
и варианты YAML).
@PropertySource
аннотации на вашем@Configuration
классы. Свойства по умолчанию (задается настройкойSpringApplication.setDefaultProperties
).
Чтобы указать файлы внешних свойств, эти параметры должны вас заинтересовать:
Специфичные для профиля свойства приложения за пределами вашего упакованного фляги (
application-{profile}.properties
и варианты YAML).Свойства приложения за пределами вашей упакованной банки (
application.properties
и варианты YAML).
@PropertySource
аннотации на вашем@Configuration
классы. Свойства по умолчанию (задается настройкойSpringApplication.setDefaultProperties
).
Вы можете использовать только один из этих 3 вариантов или комбинировать их в соответствии с вашими требованиями.
Например, для очень простых случаев достаточно использовать только специфичные для профиля свойства, но в других случаях вы можете использовать как специфичные для профиля свойства, так и свойства по умолчанию и @PropertySource
,
Расположение по умолчанию для файлов application.properties
Около application.properties
файлы (и вариант), по умолчанию Spring загружает их и добавляет их свойства в среду в следующем порядке:
Подкаталог A /config текущего каталога
Текущий каталог
Пакет classpath /config
Корень пути к классам
Высшие приоритеты так буквально: classpath:/,classpath:/config/,file:./,file:./config/
,
Как использовать файлы свойств с конкретными именами?
Расположение по умолчанию не всегда достаточно: расположение по умолчанию, например имя файла по умолчанию (application.properties
) может не подойти. Кроме того, как и в вопросе OP, вам может потребоваться указать несколько файлов конфигурации, кроме application.properties
(и вариант).
Так spring.config.name
не хватит.
В этом случае вы должны указать точное местоположение, используя spring.config.location
свойство среды (которое представляет собой разделенный запятыми список местоположений каталогов или путей к файлам).
Чтобы быть свободным в шаблоне имен файлов, добавьте список путей к файлам над списком каталогов.
Например сделать так:
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
Этот способ является наиболее подробным, когда просто указывается папка, но это также способ очень точно указать наши файлы конфигурации и четко задокументировать эффективно используемые свойства.
spring.config.location теперь заменяет местоположения по умолчанию вместо добавления к ним
С Spring Boot 1, spring.config.location
Аргумент добавляет указанные местоположения в среде Spring.
Но из Spring Boot 2, spring.config.location
заменяет местоположения по умолчанию, используемые Spring, указанными местоположениями в среде Spring, как указано в документации.
Когда настраиваемые местоположения конфигурации настраиваются с помощью
spring.config.location
, они заменяют местоположения по умолчанию. Например, еслиspring.config.location
настроен со значениемclasspath:/custom-config/
,file:./custom-config/
порядок поиска становится следующим:
file:./custom-config/
classpath:custom-config/
spring.config.location
теперь способ убедиться, что любой application.properties
файл должен быть явно указан.
Для Uber JAR, которые не должны упаковывать application.properties
файлы, это довольно приятно.
Чтобы сохранить старое поведение spring.config.location
при использовании Spring Boot 2 вы можете использовать новый spring.config.additional-location
собственность вместо spring.config.location
это все еще добавляет местоположения как указано в документации:
В качестве альтернативы, когда настраиваемые расположения конфигурации настраиваются с помощью
spring.config.additional-location
они используются в дополнение к местоположениям по умолчанию.
На практике
Итак, предположим, что, как и в вопросе OP, у вас есть 2 внешних файла свойств для указания и 1 файл свойств, включенный в uber jar.
Чтобы использовать только указанные вами файлы конфигурации:
-Dspring.config.location=classpath:/job1.properties,classpath:/job2.properties,classpath:/applications.properties
Чтобы добавить к ним файлы конфигурации в расположениях по умолчанию:
-Dspring.config.additional-location=classpath:/job1.properties,classpath:/job2.properties
classpath:/applications.properties
в последнем примере не требуется, поскольку местоположения по умолчанию имеют это и что местоположения по умолчанию здесь не перезаписываются, а расширяются.
Взгляните на PropertyPlaceholderConfigurer, я нахожу его более понятным, чем аннотация.
например
@Configuration
public class PropertiesConfiguration {
@Bean
public PropertyPlaceholderConfigurer properties() {
final PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
// ppc.setIgnoreUnresolvablePlaceholders(true);
ppc.setIgnoreResourceNotFound(true);
final List<Resource> resourceLst = new ArrayList<Resource>();
resourceLst.add(new ClassPathResource("myapp_base.properties"));
resourceLst.add(new FileSystemResource("/etc/myapp/overriding.propertie"));
resourceLst.add(new ClassPathResource("myapp_test.properties"));
resourceLst.add(new ClassPathResource("myapp_developer_overrides.properties")); // for Developer debugging.
ppc.setLocations(resourceLst.toArray(new Resource[]{}));
return ppc;
}
Это один простой подход с использованием пружинной загрузки
TestClass.java
@Configuration
@Profile("one")
@PropertySource("file:/{selected location}/app.properties")
public class TestClass {
@Autowired
Environment env;
@Bean
public boolean test() {
System.out.println(env.getProperty("test.one"));
return true;
}
}
контекст app.properties в выбранном вами месте
test.one = 1234
ваше весеннее загрузочное приложение
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(testApplication.class, args);
}
}
и предопределенный контекст application.properties
spring.profiles.active = one
Вы можете написать столько классов конфигурации, сколько захотите, и включить / отключить их, просто установив spring.profiles.active = имя профиля / имена {разделенные запятыми}
Как вы можете видеть, весенняя загрузка великолепна, ей просто нужно некоторое время, чтобы ознакомиться с ней, стоит упомянуть, что вы также можете использовать @Value на своих полях.
@Value("${test.one}")
String str;
У меня такая же проблема. Я хотел иметь возможность перезаписывать внутренний файл конфигурации при запуске внешним файлом, аналогично обнаружению Spring Boot application.properties. В моем случае это файл user.properties, в котором хранятся пользователи моих приложений.
Мои требования:
Загрузите файл из следующих мест (в этом порядке)
- Classpath
- Подкаталог A / config текущего каталога.
- Текущий каталог
- Из каталога или расположения файла, заданного параметром командной строки при запуске
Я придумал следующее решение:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.PathResource;
import org.springframework.core.io.Resource;
import java.io.IOException;
import java.util.Properties;
import static java.util.Arrays.stream;
@Configuration
public class PropertiesConfig {
private static final Logger LOG = LoggerFactory.getLogger(PropertiesConfig.class);
private final static String PROPERTIES_FILENAME = "user.properties";
@Value("${properties.location:}")
private String propertiesLocation;
@Bean
Properties userProperties() throws IOException {
final Resource[] possiblePropertiesResources = {
new ClassPathResource(PROPERTIES_FILENAME),
new PathResource("config/" + PROPERTIES_FILENAME),
new PathResource(PROPERTIES_FILENAME),
new PathResource(getCustomPath())
};
// Find the last existing properties location to emulate spring boot application.properties discovery
final Resource propertiesResource = stream(possiblePropertiesResources)
.filter(Resource::exists)
.reduce((previous, current) -> current)
.get();
final Properties userProperties = new Properties();
userProperties.load(propertiesResource.getInputStream());
LOG.info("Using {} as user resource", propertiesResource);
return userProperties;
}
private String getCustomPath() {
return propertiesLocation.endsWith(".properties") ? propertiesLocation : propertiesLocation + PROPERTIES_FILENAME;
}
}
Теперь приложение использует ресурс classpath, но проверяет ресурс и в других заданных местах. Последний ресурс, который существует, будет выбран и использован. Я могу запустить свое приложение с помощью java -jar myapp.jar --properties.location=/directory/myproperties.properties, чтобы использовать расположение свойств, которое плавает в моей лодке.
Важная деталь здесь: используйте пустую строку в качестве значения по умолчанию для properties.location в аннотации @Value, чтобы избежать ошибок, когда свойство не установлено.
Соглашение для properties.location: Использовать каталог или путь к файлу свойств как properties.location.
Если вы хотите переопределить только определенные свойства, можно использовать PropertiesFactoryBean с setIgnoreResourceNotFound(true) с массивом ресурсов, заданным как местоположения.
Я уверен, что это решение может быть расширено для обработки нескольких файлов...
РЕДАКТИРОВАТЬ
Здесь мое решение для нескольких файлов:) Как и раньше, это может быть объединено с PropertiesFactoryBean.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.PathResource;
import org.springframework.core.io.Resource;
import java.io.IOException;
import java.util.Map;
import java.util.Properties;
import static java.util.Arrays.stream;
import static java.util.stream.Collectors.toMap;
@Configuration
class PropertiesConfig {
private final static Logger LOG = LoggerFactory.getLogger(PropertiesConfig.class);
private final static String[] PROPERTIES_FILENAMES = {"job1.properties", "job2.properties", "job3.properties"};
@Value("${properties.location:}")
private String propertiesLocation;
@Bean
Map<String, Properties> myProperties() {
return stream(PROPERTIES_FILENAMES)
.collect(toMap(filename -> filename, this::loadProperties));
}
private Properties loadProperties(final String filename) {
final Resource[] possiblePropertiesResources = {
new ClassPathResource(filename),
new PathResource("config/" + filename),
new PathResource(filename),
new PathResource(getCustomPath(filename))
};
final Resource resource = stream(possiblePropertiesResources)
.filter(Resource::exists)
.reduce((previous, current) -> current)
.get();
final Properties properties = new Properties();
try {
properties.load(resource.getInputStream());
} catch(final IOException exception) {
throw new RuntimeException(exception);
}
LOG.info("Using {} as user resource", resource);
return properties;
}
private String getCustomPath(final String filename) {
return propertiesLocation.endsWith(".properties") ? propertiesLocation : propertiesLocation + filename;
}
}
Spring boot позволяет нам писать разные профили для разных сред, например, у нас могут быть отдельные файлы свойств для рабочей среды, qa и локальной среды.
Файл application-local.properties с настройками в соответствии с моей локальной машиной
spring.profiles.active=local
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=users
spring.data.mongodb.username=humble_freak
spring.data.mongodb.password=freakone
spring.rabbitmq.host=localhost
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.port=5672
rabbitmq.publish=true
Точно так же мы можем написать application-prod.properties и application-qa.properties столько файлов свойств, сколько мы хотим
затем напишите несколько сценариев, чтобы запустить приложение для разных сред, например,
mvn spring-boot:run -Drun.profiles=local
mvn spring-boot:run -Drun.profiles=qa
mvn spring-boot:run -Drun.profiles=prod
У меня только что была похожая проблема с этим и я наконец выяснил причину: файл application.properties имел неправильные атрибуты владельца и rwx. Поэтому, когда tomcat запустил файл application.properties, он находился в нужном месте, но принадлежал другому пользователю:
$ chmod 766 application.properties
$ chown tomcat application.properties
Модифицированная версия решения @mxsb, которая позволяет нам определять несколько файлов, и в моем случае это файлы yml.
В моем приложении-dev.yml я добавил этот конфиг, который позволяет мне вводить все yml, в которых есть -dev.yml. Это также может быть список определенных файлов. "Путь к классам:/test/test.yml,classpath:/test2/test.yml"
application:
properties:
locations: "classpath*:/**/*-dev.yml"
Это помогает получить карту свойств.
@Configuration
public class PropertiesConfig {
private final static Logger LOG = LoggerFactory.getLogger(PropertiesConfig.class);
@Value("${application.properties.locations}")
private String[] locations;
@Autowired
private ResourceLoader rl;
@Bean
Map<String, Properties> myProperties() {
return stream(locations)
.collect(toMap(filename -> filename, this::loadProperties));
}
private Properties loadProperties(final String filename) {
YamlPropertySourceLoader loader = new YamlPropertySourceLoader();
try {
final Resource[] possiblePropertiesResources = ResourcePatternUtils.getResourcePatternResolver(rl).getResources(filename);
final Properties properties = new Properties();
stream(possiblePropertiesResources)
.filter(Resource::exists)
.map(resource1 -> {
try {
return loader.load(resource1.getFilename(), resource1);
} catch (IOException e) {
throw new RuntimeException(e);
}
}).flatMap(l -> l.stream())
.forEach(propertySource -> {
Map source = ((MapPropertySource) propertySource).getSource();
properties.putAll(source);
});
return properties;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
Однако, как и в моем случае, я хотел бы разделить yml-файлы для каждого профиля, загрузить их и внедрить их непосредственно в конфигурацию Spring перед инициализацией bean-компонентов.
config
- application.yml
- application-dev.yml
- application-prod.yml
management
- management-dev.yml
- management-prod.yml
... вы поняли
Компонент немного отличается
@Component
public class PropertiesConfigurer extends PropertySourcesPlaceholderConfigurer
implements EnvironmentAware, InitializingBean {
private final static Logger LOG = LoggerFactory.getLogger(PropertiesConfigurer.class);
private String[] locations;
@Autowired
private ResourceLoader rl;
private Environment environment;
@Override
public void setEnvironment(Environment environment) {
// save off Environment for later use
this.environment = environment;
super.setEnvironment(environment);
}
@Override
public void afterPropertiesSet() throws Exception {
// Copy property sources to Environment
MutablePropertySources envPropSources = ((ConfigurableEnvironment) environment).getPropertySources();
envPropSources.forEach(propertySource -> {
if (propertySource.containsProperty("application.properties.locations")) {
locations = ((String) propertySource.getProperty("application.properties.locations")).split(",");
stream(locations).forEach(filename -> loadProperties(filename).forEach(source ->{
envPropSources.addFirst(source);
}));
}
});
}
private List<PropertySource> loadProperties(final String filename) {
YamlPropertySourceLoader loader = new YamlPropertySourceLoader();
try {
final Resource[] possiblePropertiesResources = ResourcePatternUtils.getResourcePatternResolver(rl).getResources(filename);
final Properties properties = new Properties();
return stream(possiblePropertiesResources)
.filter(Resource::exists)
.map(resource1 -> {
try {
return loader.load(resource1.getFilename(), resource1);
} catch (IOException e) {
throw new RuntimeException(e);
}
}).flatMap(l -> l.stream())
.collect(Collectors.toList());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
Если вы хотите переопределить значения, указанные в файле application.properties, вы можете изменить свой активный профиль, запустив приложение и создав файл свойств приложения для профиля. Так, например, давайте определим активный профиль "переопределить", а затем, если вы создали новый файл свойств приложения с именем "application-override.properties" в /tmp, вы можете запустить
java -jar yourApp.jar --spring.profiles.active="override" --spring.config.location="file:/tmp/,classpath:/"
Значения, указанные в spring.config.location, оцениваются в обратном порядке. Итак, в моем примере сначала оценивается classpat, а затем значение файла.
Если файл jar и файл application-override.properties находятся в текущем каталоге, вы можете просто использовать
java -jar yourApp.jar --spring.profiles.active="override"
так как Spring Boot найдет файл свойств для вас
Я обнаружил, что это полезный шаблон для подражания:
@RunWith(SpringRunner)
@SpringBootTest(classes = [ TestConfiguration, MyApplication ],
properties = [
"spring.config.name=application-MyTest_LowerImportance,application-MyTest_MostImportant"
,"debug=true", "trace=true"
]
)
Здесь мы переопределяем использование "application.yml" для использования "application-MyTest_LowerImportance.yml", а также "application-MyTest_MostImportant.yml"
(Spring также будет искать файлы.properties)
В качестве дополнительного бонуса также включены параметры отладки и трассировки в отдельной строке, чтобы вы могли закомментировать их при необходимости;]
Отладка / трассировка невероятно полезны, поскольку Spring выводит имена всех файлов, которые он загружает, и тех, которые он пытается загрузить.
Вы увидите такие строки в консоли во время выполнения:
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_MostImportant.properties' (file:./config/application-MyTest_MostImportant.properties) resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_MostImportant.xml' (file:./config/application-MyTest_MostImportant.xml) resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_MostImportant.yml' (file:./config/application-MyTest_MostImportant.yml) resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_MostImportant.yaml' (file:./config/application-MyTest_MostImportant.yaml) resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_LowerImportance.properties' (file:./config/application-MyTest_LowerImportance.properties) resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_LowerImportance.xml' (file:./config/application-MyTest_LowerImportance.xml) resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_LowerImportance.yml' (file:./config/application-MyTest_LowerImportance.yml) resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_LowerImportance.yaml' (file:./config/application-MyTest_LowerImportance.yaml) resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./application-MyTest_MostImportant.properties' (file:./application-MyTest_MostImportant.properties) resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./application-MyTest_MostImportant.xml' (file:./application-MyTest_MostImportant.xml) resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./application-MyTest_MostImportant.yml' (file:./application-MyTest_MostImportant.yml) resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./application-MyTest_MostImportant.yaml' (file:./application-MyTest_MostImportant.yaml) resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./application-MyTest_LowerImportance.properties' (file:./application-MyTest_LowerImportance.properties) resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./application-MyTest_LowerImportance.xml' (file:./application-MyTest_LowerImportance.xml) resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./application-MyTest_LowerImportance.yml' (file:./application-MyTest_LowerImportance.yml) resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./application-MyTest_LowerImportance.yaml' (file:./application-MyTest_LowerImportance.yaml) resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'classpath:/config/application-MyTest_MostImportant.properties' resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'classpath:/config/application-MyTest_MostImportant.xml' resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'classpath:/config/application-MyTest_MostImportant.yml' resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'classpath:/config/application-MyTest_MostImportant.yaml' resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'classpath:/config/application-MyTest_LowerImportance.properties' resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'classpath:/config/application-MyTest_LowerImportance.xml' resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'classpath:/config/application-MyTest_LowerImportance.yml' resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'classpath:/config/application-MyTest_LowerImportance.yaml' resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'classpath:/application-MyTest_MostImportant.properties' resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'classpath:/application-MyTest_MostImportant.xml' resource not found
DEBUG 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Loaded config file 'file:/Users/xxx/dev/myproject/target/test-classes/application-MyTest_MostImportant.yml' (classpath:/application-MyTest_MostImportant.yml)
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'classpath:/application-MyTest_MostImportant.yaml' resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'classpath:/application-MyTest_LowerImportance.properties' resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'classpath:/application-MyTest_LowerImportance.xml' resource not found
DEBUG 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Loaded config file 'file:/Users/xxx/dev/myproject/target/test-classes/application-MyTest_LowerImportance.yml' (classpath:/application-MyTest_LowerImportance.yml)
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'classpath:/application-MyTest_LowerImportance.yaml' resource not found
TRACE 93941 --- [ main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_MostImportant-test.properties' (file:./config/application-MyTest_MostImportant-test.properties) resource not found
Вы можете использовать так
-Dspring.profiles.active=intranet
если у вас есть application-intranet.properties в вашей папке ресурсов. Обратите внимание: интранет — это мое конкретное имя файла, ваше должно быть другим.
Я столкнулся с множеством проблем, пытаясь понять это. Вот моя установка,
Dev Env: Windows 10, Java: 1.8.0_25, Spring Boot: 2.0.3.RELEASE, Spring: 5.0.7.RELEASE
Я обнаружил, что пружина придерживается концепции "Разумные настройки по умолчанию". Это означает, что все ваши файлы свойств должны быть частью вашего боевого файла. Оказавшись там, вы можете затем переопределить их, используя свойство командной строки "--spring.config.additional-location", чтобы указать на внешние файлы свойств. Но это НЕ РАБОТАЕТ, если файлы свойств не являются частью исходного файла war.
Демонстрационный код: https://github.com/gselvara/spring-boot-property-demo/tree/master