Как программно сообщить приложению Spring Boot, что application.yml находится в домашнем каталоге пользователя приложения? - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь переместить мой application.yml за пределы моего приложения в каталог пользователя, под которым работает приложение. Я знаю, что общий подход заключается в использовании параметров запуска во время выполнения, таких как -Dconfig.location=/path/to/external.properties (что, кстати, я не могу заставить работать должным образом), но я должен быть в состоянии сделать это без изменения сценария запуска, если это вообще возможно ,

Моя цель состояла в том, чтобы сделать это в методе main() файла приложения, который запускает приложение. В этом методе я обнаруживаю домашний каталог пользователя и пытаюсь установить его как свойство для приложения. Тем не менее, все попытки, которые я пробовал, заканчивались FileNotFound (application.yml). Может кто-нибудь предложить какой-нибудь совет по достижению того, чего я хочу? Ниже приведена самая последняя попытка

static void main(String[] args)  throws NoSuchAlgorithmException, IOException, URISyntaxException  {
    String configPath = "${System.getProperty('user.home')}"
    ConfigurableApplicationContext applicationContext = new SpringApplicationBuilder(Angular4SpringbootApplication)
            .properties("spring.config.name:application,conf",
            "spring.config.location=classpath:$configPath/application.yml")
            .build().run(args)

    SpringApplication.run(Angular4SpringbootApplication, args)
}

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Поскольку вы передаете параметры командной строки в SpringApplication.run, вы можете просто изменить их раньше. Я не знаю много о Groovy, но я думаю, что это должно работать:

static void main(String[] args) {
    SpringApplication.run(Angular4SpringbootApplication, ["--spring.config.location=file:${System.getProperty('user.home')}/application.yml"] + args)
}

Вы также можете установить системное свойство перед запуском контекста Spring:

static void main(String[] args) {
    System.setProperty('spring.config.location', "${System.getProperty('user.home')}/application.yml")
    SpringApplication.run(Angular4SpringbootApplication, args)
}
0 голосов
/ 14 марта 2019

Если вам не нравятся application.properties в качестве файла конфигурации имя, вы можете переключиться на другое имя файла, указав свойство среды spring.config.name. Вы также можете обратиться к явное местоположение с помощью среды spring.config.location свойство (которое представляет собой разделенный запятыми список каталогов или пути к файлам). В следующем примере показано, как указать другой имя файла:

java -jar myproject.jar --spring.config.name=myproject

Или вы можете использовать местоположение (если файл rour находится вне вашего приложения, используйте префикс file:):

java -jar myproject.jar --spring.config.location=classpath:/default.properties

spring.config.name и spring.config.location используются очень рано определить, какие файлы должны быть загружены, поэтому они должны быть определены как свойство среды (обычно переменная среды ОС, система свойство или аргумент командной строки).

Редактировать

Если вы хотите сделать это без изменения сценария запуска, вы можете сделать это следующим образом:

@SpringBootApplication
public class SimpleBoot {

    public static void main(String[] args) {
        System.setProperty("spring.config.location","file:/path/to/application.yml")
        SpringApplication.run(SimpleBoot.class, args);
    }

}
...