如何在Spring中继承application.properties?

时间:2017-06-23 10:08:25

标签: java spring spring-boot

如果我创建一个公共库,其中application.properties定义了常见配置。像:

spring.main.banner-mode=off

如何将这些属性继承到我包含这些公共库的另一个项目中?

的Maven:

<project ...>
    <groupId>de.mydomain</groupId>
    <artifactId>my-core</artifactId>
    <version>1.0.0</version>

    <dependencies>
        <dependency>
            <!-- this one holds the common application.properties -->
            <groupId>my.domain</groupId>
            <artifactId>my-commons</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
</project>

如何将配置从my-commons继承到my-core

2 个答案:

答案 0 :(得分:4)

解决方案是使用其他名称包含共享属性,此处为application-shared.properties

在共享库中:

@SpringBootApplication
@PropertySource(ResourceUtils.CLASSPATH_URL_PREFIX + "application-shared.properties") //can be overridden by application.properties
public class SharedAutoConfiguration {
}

在主应用中:

@SpringBootApplication
@Import(SharedAutoConfiguration.class)
public class MainAppConfiguration extends SpringBootServletInitializer {

}

这样可以加载commons / shared配置,但是可以在主app的application.properties中覆盖。

它不适用于spring.main.banner-mode属性(不知道为什么),但是对于所有其他属性,它运行良好。

答案 1 :(得分:0)

你可以尝试使用Spring。

您可以在提及的公共模块中定义src/main/resources/application.properties。它将出现在依赖于它的其他项目的类路径中。

然后使用注释@PropertySource,在依赖于公共模块的其他项目中:

@Configuration
@PropertySource("classpath*:META-INF/spring/properties/*.properties")
public class Config {
  ...
}

或使用XML配置:

<context:property-placeholder location="classpath*:META-INF/spring/properties/*.properties"/>

它应该导入给出classpath目录中的所有配置文件。

另外,您应该知道在类路径中不能有两个相同的文件。你会发生冲突。

例如,这种情况会产生冲突

项目A(取决于项目B):

  • src/main/resources/application.properties

项目B:

  • src/main/resources/application.properties

您必须重命名application.properties文件或将其放在不同的目录中。