如何在spring-boot中添加多个application.properties文件?

时间:2015-10-20 06:47:48

标签: java spring spring-boot

我有一个Spring启动应用程序,它分为几个模块。 主模块运行应用程序,并在resources文件夹中有一个application.properties文件。我想知道是否可以在子模块中添加另一个属性文件来分隔属于该模块的属性以及如何使其工作(因为它不是)。

+main_module
  +src
    +main
      +java
        +my/package/Application.java
        +resources/application.properties
+support_module
  +src
    +main
      +java
        +resources/application.properties

所以,这就是目前的情况。很明显,模块support_module中的属性文件不会被读取而导致NoSuchBeanDefinitionException,而如果我将内容放在其他属性文件中,一切正常。

4 个答案:

答案 0 :(得分:20)

使用Maven或Gradle时,您尝试执行的操作无效。原因是当创建工件(自从您使用Spring Boot以来很可能是jar)时,根目录中只会有一个application.properties文件。

我建议您更改支持模块上属性文件的名称,然后配置Spring Boot以查找该文件(请查看thisthis答案以获取指针) ,或者为你的构建工具使用某种合并任务(或许类似this

答案 1 :(得分:5)

您还可以使用spring.config.location环境属性(以逗号分隔的目录位置列表或文件路径)来引用显式位置

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

有关详细信息,请click

答案 2 :(得分:1)

Spring Boot按以下顺序读取属性文件。 (来自Spring Boot in Action)

  
      
  1. 外部,在运行应用程序的目录的/ config子目录中
  2.   
  3. 外部,在运行应用程序的目录中
  4.   
  5. 在内部,名为“config”
  6. 的包中   
  7. 内部,位于类路径的根
  8.   

因此,将application.properties放在config子目录中会使其具有更高的优先级。在以下配置中,application.properties中的module_a优先。您可以在application.properties中添加常见默认值,并通过将配置文件放在config/application.properties中来覆盖各个模块中的默认值。

+common_module
  +src
    +main
      +java
        +resources/application.properties
+module_a
  +src
    +main
      +java
        +my/package/Application.java
        +resources/config/application.properties

答案 3 :(得分:1)

问题恰恰是@geoand描述的。 Spring Boot会加载顶级application.properties,并忽略位于其他jar中的具有确切名称的任何属性文件。

但是我没有找到有关解决此问题的任何具体实现,所以这里是给那些想知道实现的人的。

考虑此项目配置:

+main_module
  +src
    +main
      +java
        +my/package/Application.java
      +resources/application.properties
+module_aa
  +src
    +main
      +java
        +my/package/config/ModuleAAConfig.java
      +resources/module_aa.properties
+module_bb
  +src
    +main
      +java
        +my/package/config/ModuleBBConfig.java
      +resources/module_bb.properties

现在要正确加载每个子模块的属性,我们需要在每个模块的配置上添加@PropertySource批注,即ModuleAAConfig.java, ModuleBBConfig.java

示例:

ModuleAAConfig.java

package my.package.config;

@Configuration
@PropertySource(
    ignoreResourceNotFound = false,
    value = "classpath:module_aa.properties")
public class ModuleAAConfig {}

ModuleBBConfig.java

package my.package.config;

@Configuration
@PropertySource(
    ignoreResourceNotFound = false,
    value = "classpath:module_bb.properties")
public class ModuleBBConfig {}

奖金:

如果您要加载配置文件特定的属性,则可以使用诸如spring变量之类的方法来加载。

@PropertySource("classpath:module_aa-${spring.profiles.active}.properties")