我有一个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
,而如果我将内容放在其他属性文件中,一切正常。
答案 0 :(得分:20)
使用Maven或Gradle时,您尝试执行的操作无效。原因是当创建工件(自从您使用Spring Boot以来很可能是jar)时,根目录中只会有一个application.properties
文件。
我建议您更改支持模块上属性文件的名称,然后配置Spring Boot以查找该文件(请查看this或this答案以获取指针) ,或者为你的构建工具使用某种合并任务(或许类似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)
- 外部,在运行应用程序的目录的/ config子目录中
- 外部,在运行应用程序的目录中
- 在内部,名为“config”
的包中- 内部,位于类路径的根
醇>
因此,将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")