Spring Boot 外部 application.properties

17

我正在开发一个Spring Boot应用程序。

我想要使用一个外部文件(例如/etc/projectName/application.properties)覆盖src/main/resources/application.properties中的一些属性。

我尝试了几种方法:

  1. ApplicationConfig.java中,使用注释@PropertySource("file:/etc/projectName/application.properties")

  2. resources中的application.properties文件中使用spring.config.location=/etc/projectName/application.properties

我使用spring.port进行测试。第一种方法只添加了属性,没有覆盖它们。


4
application.properties 放在与 jar 文件相同的目录下,它会被自动识别。 - M. Deinum
我正在使用一个war文件,在Intellij中使用maven构建并部署到Tomcat,因此没有jar文件。 - greenhalos
无论您的问题是什么,这都会影响答案。但是,您应该使用选项2,因为Spring Boot加载的属性是有序的。添加@PropertySource将把您加载的属性添加到咨询的PropertySource链的末尾。 - M. Deinum
greenhalos,你解决了这个问题吗?我的war文件也有同样的问题。我不想在tomcat启动配置中添加参数,但如果必须的话,我会这样做。 - bwfrieds
主要是由于拥有不同数据库设置的开发人员,我需要这样做。我通过将默认应用程序属性放置在资源目录中,并将自定义属性放置在资源目录内新目录config中以覆盖默认属性来解决了问题。config目录中的属性会覆盖资源目录中的属性。在生产环境中,我会在tomcat脚本中设置属性。希望这正是你正在寻找的内容。 - greenhalos
1
@M.Deinum - 实际上,我发现application.properties需要在当前工作目录中才能被拾取。 - Janik Zikovsky
7个回答

27

我经常像文档中指定的那样,在命令行中使用--spring.config.location=,你可以在其中放置多个文件,一个文件是默认值,另一个文件是替代值。

编辑:
或者,你也可以使用类似以下的方式:

@PropertySources({
    @PropertySource("classpath:default.properties")
    , @PropertySource(value = "file:${external.config}", ignoreResourceNotFound = true)
})

在你的application.properties中指定一个external.config。这将提供一个默认路径来覆盖配置,并仍然可以通过在命令行中指定--external.config来覆盖它本身。
我使用${external.config}被定义为系统环境变量,但它也应该适用于application.properties变量。


但我希望不通过命令行指定,而是通过应用程序属性或注释来实现。 - greenhalos
4
我建议不要这样做:这意味着你正在将你的源代码与外部环境联系起来,这样你的源代码有可能在另一台机器上不能正常工作(更不用说需要 root 权限才能编写配置文件了)。依我之见,与外部环境相关的东西应该保持在源代码之外。 - JR Utily
命令行不是部署中被允许的内容。管理员不会修改任何脚本。 - signonsridhar

4

我有和你一样的需求(使用war包而不是一个fat jar包),我成功地将配置文件外部化了:

在我的主类中,我实现了以下配置:

@SpringBootApplication
@PropertySource("file:D:\\Projets\\XXXXX\\Config\\application.properties")
public class WyApplication extends SpringBootServletInitializer {

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

}   

希望这能帮到您。 祝好。


3

注意事项

1) Tomcat允许您定义上下文参数 2) Spring Boot将读取在Tomcat上下文参数中定义的属性,就像您将它们定义为-Dsomething=some_value一样

选项

选项1: 因此,您可以在Tomcat上下文参数中定义spring.config.location

<Context>
    <Parameter name="spring.config.location" value="/path/to/application.properties" />
</Context>

选项2:在Tomcat的setenv.sh文件中定义系统属性。
Dspring.config.location=/path/to/application.properties

选项3: 定义一个环境变量: SPRING_CONFIG_LOCATION

该选项是通过定义环境变量来指定Spring应用程序的配置文件位置。可以将此环境变量设置为包含应用程序配置文件的目录或文件的路径。


2
如果您不想使用上述任何解决方案,您可以在main(String args[])方法的开头执行以下操作(在使用SpringApplication.run(MyClass.class, args)之前):
//Specifies a custom location for application.properties file.
System.setProperty("spring.config.location", "target/config/application.properties");

0
根据@JR Utily的回复,当使用电子邮件配置和多个属性时,这种“格式”对我有效(我尝试使用PropertySourcesPlaceholderConfigurer Bean,但由于某种原因无法使用电子邮件配置):
@SpringBootApplication
@PropertySources({
    @PropertySource("classpath:application.properties"),
    @PropertySource(value = "file:/path/to/config1.properties", ignoreResourceNotFound = true),
    @PropertySource(value = "file:/path/to/config2.properties", ignoreResourceNotFound = true),
    @PropertySource(value = "file:/path/to/config3.properties", ignoreResourceNotFound = true)
})
public class ExampleApplication {

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

0

是的,我们可以从外部文件夹添加application.properties文件。最简单的方法是

@SpringBootApplication
public class ExternalAppPropertiesTest{

    public static void main(String[] args) {
        System.setProperties("spring.config.location","D:\\yourfoldername where application.properties added");
        SpringApplication.run(ExternalAppPropertiesTest.class, args);
    }
}

注意 - 如果外部应用程序.properties访问,请不要使用@PropertySources注释和文件路径。它将无法访问您的日志记录属性,例如logging.file.name=yourlogfilename.log

这里还有一个建议,为了代码维护,您可以通过重命名Spring Boot应用程序的src文件夹中的文件名来放置您的applcation.properties并保留在外部文件中进行的更改。


0

注意:以下解决方案将完全替换旧的application.properties文件

您可以将您的application.properties文件放置在以下位置之一:

  • 当前目录下的/config子目录中
  • 当前目录
  • 类路径(classpath)下的/config包中
  • 类路径根目录

然后排除资源目录下的默认文件,例如:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <excludes>
                <exclude>**/application.properties</exclude>
            </excludes>
        </resource>
    </resources>
</build>

在这个链接中查找更多详细信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接