Spring boot как читать файл свойств вне jar

в моей целевой папке есть 2 папки, lib и conf. все файлы свойств помещаются в папку conf, а банки помещаются в lib foulder.

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

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

и в коде java, например:

@Value("${name}")

private String name;

но в spring boot я не знаю, как сделать то же самое в java-коде.

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

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

5 ответов


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

В общем, Spring Boot очень самоуверенно относится к структуре проекта, а также к созданному двоичному файлу. Рекомендуемый способ (мнение Spring Boot) - построить банку со всеми зависимостями внутри (fat jar). Если вам нужны свойства конфигурации, определенные вне вашего fat jar (или war, если это то, что вы создали), Spring Boot предлагает множество вариантов (см. ссылку 1). Мне нравится, чтобы мои приложения указывали на внешний файл, используя флаг (spring.конфиг.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


@Configuration
public class ApplicationContext {

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

    return properties;
  }
}

когда я устанавливаю местоположение приложения.файл свойств я создал объект FileSystemResource, который позволяет мне получить свойства.файлы, которые расположены рядом с jar. Если .файлы свойств в classpath, например, вы можете используйте другие классы (например, ClassPathResource). Вы можете прочитать другие классы, которые spring предлагает для получения объекта ресурса в организации пакета.springframework.ядро.Ио. .

Я надеюсь, что эти комментарии помогут.


нашел решение:

сначала создайте класс и добавьте @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);
    }
}

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


нашли другое решение.

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

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

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

Это потому, что spring boot читает приложение.файл свойств в последующих последовательность.

• подкаталог /config, расположенный в текущем каталоге

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

• пакет classpath /config

• в classpath корень

но это работает для одного свойства файла. не для файлов свойств multiply


как говорится в Spring Boot docs,

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

  1. подкаталог a /config текущего каталога.
  2. текущий каталог
  3. пакет classpath /config
  4. корневой путь к классам

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

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

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

@PropertySource("classpath:config.properties")

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

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