2017-01-20 15 views
6

в моей целевой папке, есть 2 папки, lib и conf. все файлы свойств помещаются в папку conf, а банки помещаются в lib foulder.Spring boot Как читать файл свойств за пределами jar

предыдущий до весны загрузки, мы используем следующие конфигурации в spring.xml использовать @value

<context:property-placeholder location="classpath*:*.properties"/> 

и в Java коде, как:

@Value("${name}") 

private String name; 

но весной ботинке, я не знаете, как сделать то же самое в Java-коде.

Я попытался следующие, но не работает

@Configuration 
@PropertySource(value = "classpath:aaa.properties") 
public class AppConfig { 
    @Bean 
    public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
    return new PropertySourcesPlaceholderConfigurer(); 
    } 
} 

ответ

13

Я немного смущен названия вопроса и описания. Надеюсь, я больше не буду вас путать с моими комментариями.

В общем, Spring Boot ОЧЕНЬ прокомментировал структуру проекта, а также созданный двоичный файл. Рекоментированный способ (мнение Spring Boot) заключается в том, чтобы построить банку со всеми зависимостями внутри (жирная банка). Если вам нужны свойства конфигурации, определенные вне вашей толстой банки (или война, если это то, что вы создали), Spring Boot предлагает множество опций (см. Ссылку 1). Я хотел, чтобы мои приложения к точке на внешний файл, используя флаг (spring.config.location), который может быть установлен с системным свойством:

java -jar -Dspring.config.location=<path-to-file> myBootProject.jar 

Обратите внимание, что вы можете сделать что-то подобное с помощью переменной среды для определения где живет ваш внешний файл.

Надеюсь, это поможет!

Список литературы: 1. https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

+0

Спасибо, это предложение большое значение –

+0

Вы знаете, если у меня есть умножить файлы свойств, как читать его в отдельный класс конфигурации? –

+0

Вы имеете в виду несколько внешних файлов? – Alberto

1

Обнаружили решение:

сначала создать класс и добавить @ConfigurationProperties

@ConfigurationProperties(prefix = "asdf", locations = "file:conf/aaa.properties") 
public class ASDF { 
    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

Пожалуйста, отмеченные в местах, я использую файл , а не classpath.

затем в своем классе приложения, добавьте @EnableConfigurationProperties

@SpringBootApplication 
@EnableConfigurationProperties({ASDF.class, BBB.class}) 
public class InitialBeanTestApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(InitialBeanTestApplication.class, args); 
    } 
} 

, то вы можете прочитать конфигурационный файл в папке конф

0

Найдено другое решение.

размещать каждую конфигурацию в одном файле application.properties, а в коде использовать @Value ("$ {name}") для чтения.

и используйте файл сборки, чтобы скопировать файл папок ресурса в целевую конфигурационную папку.

и после развертывания просто нужно изменить файл application.properties в папке config и запустить приложение.

это, потому что весенняя загрузка читает файл application.properties в последовательности следования.

• The/конфигурации подкаталоге находится в текущем каталоге

• текущего каталога

• путь к классам/конфигурации пакета

• Путь к папкам, корень

, но это работает для одного свойства файл. не для многократных файлов свойств

4

Я не уверен, что вы имеете дело с той же ситуацией, что и я, но в моем случае у меня есть файл jar и * .properties вне его. То, что я сделал, чтобы получить файл * .properties, расположенный за пределами баночки была следующим:

@Configuration 
public class ApplicationContext { 

    @Bean 
    public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
    PropertySourcesPlaceholderConfigurer properties = new PropertySourcesPlaceholderConfigurer(); 
    properties.setLocation(new FileSystemResource("application.properties")); 
    properties.setIgnoreResourceNotFound(false); 

    return properties; 
    } 
} 

Когда я устанавливаю расположение application.properties файл я создал FileSystemResource объект, который позволит мне получить properties.files который расположен рядом с банкой. Если ваши файлы .properties находятся в пути к классам, например, вы можете использовать другие классы (например, ClassPathResource). Вы можете прочитать другие классы, которые весной предлагают получить объект Resource под пакетом org.springframework.core.io..

Надеюсь, этот комментарий поможет.

+0

Это, кажется, более универсальное решение.Если вы хотите установить несколько местоположений, используя метод setLocations. – SashikaXP

1

Как уже упоминалось в Spring Boot docs,

SpringApplication загрузит свойства из application.properties файлов в следующих местах и ​​добавить их к весне среды:

  1. A/конфигурационный подкаталог тока каталог.
  2. Текущего каталог
  3. пути к классам/конфигурация пакета
  4. Путь к классам корень

Список упорядочен по старшинству (свойства, определенные в местах выше в списке переопределить те, которые определены в нижних точках).

Один из способов - просто переименовать каталог «conf» в «config», и он будет работать без проблем. Таким образом, нет необходимости выполнять дополнительную настройку до тех пор, пока вы не захотите, чтобы ваш файл свойств находился в некотором месте, отличном от указанного выше.

В этом случае вы можете явно определить источник свойства.

@PropertySource("classpath:config.properties") 

и для нескольких свойств файла

@PropertySources({ 
    @PropertySource("classpath:config.properties"), 
    @PropertySource("classpath:logging.properties"), 
    @PropertySource(value="classpath:missing.properties", ignoreResourceNotFound=true) 
})