如何以编程方式告诉Spring Boot应用程序application.yml在应用程序用户主目录中?

时间:2019-03-14 19:14:10

标签: spring spring-boot groovy configuration

我正在尝试将application.yml从我的应用程序移至该应用程序运行所在的用户目录。我知道一种常见的方法是在运行时使用-Dconfig.location=/path/to/external.properties之类的启动参数(顺便说一句,我似乎无法正确地进行工作),但是如果需要,我必须能够在不更改启动脚本的情况下做到这一点一切可能。

我的目标是在启动应用程序的groovy文件的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 :(得分:0)

  

如果您不喜欢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很早就用于   确定必须加载哪些文件,因此必须将它们定义为   环境属性(通常是OS环境变量,系统   属性或命令行参数)。

编辑

如果您想在不更改启动脚本的情况下进行操作,则可以这样操作:

@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);
    }

}

答案 1 :(得分:0)

由于您将命令行参数传递给了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)
}