2017-02-20 138 views
2

我將我的Spring Boot應用程序作爲WAR文件部署在Tomcat中。我期待我的application-local.properties覆蓋也存在於我的application.properties文件中的值。但是,似乎只有在application.properties中不存在這些鍵時纔會讀取application-local.properties中的值。我application.properties文件放在src /主/資源我的項目/和application-local.properties位於$ {}的catalina.home/property_files/COM /演示/ config文件夾Spring @PropertySources值不是重寫

的context.xml

<Parameter name="spring.profiles.active" value="local" override="false"/> 

catalina.properties

shared.loader=${catalina.home}/property_files 

AppConfig.java

@Configuration 
@PropertySources({ 
    @PropertySource("classpath:application.properties"), 
    @PropertySource("classpath:com/demo/config/application-${spring.profiles.active}.properties") 
}) 
public class AppConfig extends WebMvcConfigurerAdapter { 
} 

編輯1:實際上,我的環境依賴屬性文件正在加載。但它不覆蓋內部屬性文件中的任何值。

編輯2:感謝您的所有建議。但是我發現我的問題是由目錄優先權造成的。原來,根類路徑上的屬性文件比任何屬性文件具有更高的優先級,無論它們被聲明的順序如何。

+0

基本上,我只是想使用src /主/資源/本地application.properties發展中的價值可以被另一個不同的環境(開發集成,QA,UAT,生產)上的另一個屬性文件覆蓋。 –

回答

2

代替使用許多propertySource註釋嘗試設置的同時開始 應用

Java的罐子myproject.jar --spring.config.location = {your_location} /application.properties,classpath :/override.properties。

無論您作爲命令行的一部分提供什麼,它的優先級都是最高的 。
或做這樣的事情和測試

@Configuration 
@PropertySource("classpath:application.properties") 
public class DefaultConfiguration {} 
@Configuration 
@PropertySource("classpath:{environment_specific_property_name}.properties") 
public class EnvironmentSpecific{ 

    @Configuration 
    @Import(DefaultConfiguration .class) 
    static class Configuration {} 

} 
+0

好的做法是從classpath中刪除所有屬性文件,並將其保存在{specific_config_location}中,並在服務器啓動期間提供位置以便像之前提到的那樣彈出 – user121290

+0

其實,我的環境相關屬性文件正在加載。但它不覆蓋內部屬性文件中的任何值。 –

+0

我編輯了答案,請檢查一下。 :) – user121290

0

應該是:

@Configuration 
@PropertySources({ 
    @PropertySource("classpath:application.properties"), 
    @PropertySource("file:${catalina.home}/property_files/com/demo/config/application-${spring.profiles.active}.properties") 
}) 
public class AppConfig extends WebMvcConfigurerAdapter { 
} 

未經測試

+1

它沒有工作。當我在我的catalina.properties中聲明shared.loader = $ {catalina.home}/property_files時,我相信配置文件相關的屬性文件已經添加到類路徑中。實際上,當我刪除application.properties中的任何衝突條目時,我不會遇到任何問題。我只是希望重寫相同的鍵 –

0

您可以使用此配置與外部application.properties文件覆蓋從application.properties在類路徑屬性, 忽略了以後,如果沒有這樣的文件存在,請注意order參數,如果有多個文件,則可以設置優先順序。

<!--load from external file first--> 
<context:property-placeholder order="1" ignore-resource-not-found="true" 
     location="file:/path_to/your_app/application.properties" ignore-unresolvable="true"/> 
<!--load any properties not found in file from class path--> 
<context:property-placeholder order="2" 
     location="classpath:application.properties" ignore-unresolvable="true"/> 
0

你可以使用:

@Configuration 
@PropertySources({ 
    @PropertySource("classpath:application.properties"), 
    @PropertySource("file:${catalina.base}/property_files/com/demo/config/application-${spring.profiles.active}.properties") 
}) 
public class AppConfig extends WebMvcConfigurerAdapter { 
} 

這應該工作,如果文件實際上位於指定的地點,並會得到所需的值。

+2

其實,我的環境依賴屬性文件正在加載。但它不覆蓋內部屬性文件中的任何值。 –

0

感謝您的所有建議。但是我發現我的問題是由目錄優先權造成的。原來,根類路徑上的屬性文件比任何屬性文件具有更高的優先級,無論它們被聲明的順序如何。

0

而不是application.properties,將您的默認配置/屬性放在一個不同的文件中。看來在application.properties中定義的屬性值具有最高的優先級。

所以,像這樣將工作:

@Configuration 
@PropertySource("classpath:application-env.properties") 
@PropertySource(value="file:${application.home}/application-env.properties",ignoreResourceNotFound=true) 
public class GlobalSettings { 
    //configuration values 
} 

春4.x版和Java測試8