2016-10-07 53 views
10

我們正在使用彈簧啓動應用程序,其屬性從application.yml文件,而不是application.properties加載,位於的src /主/資源/它看起來象下面這樣:
配置:
主機:本地主機:8080
服務器:123使用的配置特性的兩個YAML文件

而且他們在一個.java文件被拉到這樣

@ConfigurationProperties(prefix="config") 
public class ConnectionImpl implements Connection{ 
@Value("${config.host}") 
private Stringhost; 
} 

我能夠檢索屬性這種方式。 但我們試圖將application.yml的配置屬性移動到位於不同位置的不同.yml文件。 (SRC /主/資源/ ENV-CONFIG)。
現在我無法以相同的方式檢索屬性,即使用@Value註釋。是否有任何其他註釋需要添加?

+0

您是否需要同時或在不同的環境下加載兩個yaml屬性 - 例如。 dev/test/prod環境?另外,您是否需要配置屬性,或者您是否可以使用Properties源?例如。 @PropertySource(「classpath:$ {some.file.name} .yaml」) - 通過這種方式,您可以在java命令行啓動調用中使用OS env變量SOME_FILE_NAME或像-Dsome.file.name =這樣的參數。 – chaos

+0

我們同時需要兩者。我們需要配置屬性。 – user2296988

+0

在這種情況下,我會混合使用多個屬性文件+環境變量。例如,我會有「jms。 .yaml」和「db。 .yaml」,甚至是「utils。.yaml」。這些文件中的每一個都會有一個用@PropertySource註釋的pojo(「classpath:/ com/$ {my.path:default/path}/db。$ {env:local} .properties」) - 你可以用-Dmy .path = path/to/yaml/files和-Denv = dev在命令行中 - 所以如果你將yaml打包到你的jar中,它會在那裏找到道具,但是如果你需要把它改成文件系統上的yaml文件,你也可以在那裏覆蓋它。 – chaos

回答

3

你會在一個更好的位置,如果你避免硬編碼文件路徑,這樣你的代碼庫中。 @ConfigurationProperties曾用於擁有locations屬性,但已棄用並已在1.5中刪除。

在Spring Boot中,您將配置Environment這是您配置的單一來源。您不應將設置隱藏在代碼中,而應該配置Spring Boot以讀取您需要的文件。 Read the documentation for spring.config.location。如果你想這樣做,以更加透明的方式,也許EnvironmentPostProcessor is what you need

+0

嗨斯蒂芬妮,謝謝你的回答。不確定你的意思是使用spring.config.location。在我的application.yml中,我通過使用config給出了另一個yaml的位置: location:classpath:/env-config/service-config.yml。但它仍然沒有從這裏選擇房產。 – user2296988

+0

閱讀文檔應該有所幫助。您不能在那裏指定該屬性,它必須在應用程序啓動時設置。請參閱我提供的鏈接瞭解更多詳情。 –

8

documentation

SpringApplication將負載從application.properties(或application.yml)文件的屬性在以下位置,並將它們添加到春節Environment

  1. A /config當前目錄的子目錄。
  2. 當前目錄
  3. 類路徑/config
  4. 類路徑根

如果你不喜歡application.properties,你可以通過指定spring.config切換到另一個配置文件名。名稱環境屬性。 您還可以使用spring.config.location環境屬性(逗號分隔的目錄位置列表或文件路徑)來引用顯式位置。

始終使用默認搜索路徑classpath:,classpath:/config,file:,file:config/,與spring.config.location的值無關。此搜索路徑按優先級從低到高排序(file:config/獲勝)。如果您確實指定了自己的位置,則它們優先於所有默認位置,並使用相同的最低到最高優先順序。通過這種方式,您可以在application.properties(或您選擇的其他基本名稱spring.config.name)中爲您的應用程序設置默認值,並在運行時用其他文件覆蓋它,並保留默認值。

您需要提供一個命令行參數,該參數告訴SpringApplication專門查找的位置。如果resources/一切都加入到classpath根目錄,那麼你的命令行看起來像:

java -jar myproject.jar --spring.config.location=classpath:/env-config/service-config.yml

如果你在那裏仍然會加載一個普通application.ymlresources/的特性,但會採取較低優先於命令行中指定的屬性文件。

5

你的問題並沒有說明你打算做什麼,但是如果你想針對不同的環境有不同的配置(例如development,test,production),那麼有一個簡單的解決方案。在這樣的項目中的文件層次

將您的配置文件:

src/ 
    main/ 
    resources/ 
     application.yml 
     application-development.yml 
     application-test.yml 
     application-production.yml 

現在,當您開始

java -jar mySpringApplication.jar -Dspring.profiles.active=development 

您的應用程序從application.yml配置將被視爲「基地層「,由application-development.yml中的配置覆蓋。這樣,您可以在application.yml中的所有環境中使用「默認」設置,在application-ENV.yml文件中使用環境特定配置。同樣的作品爲testproduction