Spring загрузить как читать файл свойств за пределами jar

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

перед загрузкой spring, мы используем следующую конфигурацию в spring.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();
    }
}

Ответ 1

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

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

Ответ 2

Я не уверен, что вы имеете дело с той же ситуацией, что и я, но в моем случае у меня есть файл 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 находятся в пути к классам, например, вы можете использовать другие классы (например, ClassPathResource). Вы можете прочитать другие классы, которые spring предлагает получить объект ресурса в пакете org.springframework.core.io..

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

Ответ 3

Как упоминалось в документах Spring Boot,

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

  1. Подкаталог /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)
})

Ответ 4

Найдено решение:

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

Ответ 5

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

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

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

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

потому что spring загружать файл application.properties в следующую последовательность.

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

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

• Пакет classpath/config

• Корень корня

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

Ответ 6

На самом деле, самый простой способ - это поместить application.properties и your.jar в один каталог, и просто java -jar your.jar автоматически загрузит этот внешний файл конфигурации.

И если вы пытаетесь загрузить какой-либо контекст/файлы из папки ресурсов через ClassPathResource, при чтении файла не используйте pathResource.getFile(), вместо этого используйте pathResource.getInputStream(), однако getFile() хорошо работает в вашей IDE, однако это не работает с отдельной jar.