我正在尝试设置后端应用程序,因此它会根据环境获取不同的配置文件。
在开发环境中,我想从类路径中加载默认的application.yml。当我通过mvn spring-boot:run
或java -jar ./target/myapp.war
但是,当此应用在Tomcat上运行时,应从服务器特定的文件(例如, /etc/apps/myapp/application.yml
(不是来自classpath的默认值),因为服务器具有不同的mongodb凭据等...
我不想使用profiles
,因为这意味着我需要将服务器凭据放入application.yml中github上的项目中。我只希望服务器管理员知道这一点,而开发人员对此一无所知。
有什么办法可以告诉tomcat中的该应用程序加载不同的配置文件。
在此Tomcat中,我还有其他使用Spring Boot的应用程序,因此我需要一些独立的解决方案。并非全局设置spring.config.location
,因为所有应用程序都会加载该文件。
答案 0 :(得分:0)
如果您想从外部位置读取属性,请在应用程序中写入bootstrap.yml
,然后删除application.yml
。
bootstrap.yml:
spring:
config:
location: file:/home/external/properties/location/
name: application
profiles:
active: dev
文件位置:/home/external/properties/location/
假设您需要开发和生产环境,然后将此3个属性文件保存在此位置。
application.yml
application-dev.yml
application-prod.yml
Spring Boot首先读取application.yml
属性。如果在dev
中设置了活动配置文件bootstrap.yml
,则application.yml
的值将被application-dev.yml
覆盖。
或者您可以使用配置服务器
看this
答案 1 :(得分:0)
您可以将@PropertyResource
注释与上下文xml一起使用。
注意:ignoreResourceNotFound
不会在找不到文件时抛出异常,例如对于Dev env。
@Configuration
@PropertySources({
@PropertySource("classpath:application.properties"),
@PropertySource(value = "file:${config.file}", ignoreResourceNotFound=true)
})
public class AppConfig {
//...
}
/META-INF/context.xml
<Context>
<Parameter name="config.file" value="/yourpath/application.properties"/>
</Context>
如果您不想在项目内部的context.xml中保存路径,则可以使用其他方法来定义应用程序级上下文,具体取决于您的tomcat版本。请refer在此处以获取有关Tomcat 9的详细信息。