2014-09-03 90 views
1

Spring引導有能力externalize的配置,這意味着you can work with the same application code in different environments在Spring Boot和一次性測試中的外部配置

你可以綁定你的jar中的application.properties,它提供了一個合理的默認名字 。在生產環境中運行時, application.properties可以在您的jar外部提供,即 覆蓋名稱;和一次性測試,您可以用 特定的命令行開關啓動:

java -jar app.jar --name="Spring" 
  1. 什麼是一次性的測試實際上是什麼意思?
  2. 我該如何work with the same application code in different environments
+0

*一次性*意味着「只有一次」或在這種情況下是一個配置,你想檢查或測試,但不是永恆。你怎麼說「我怎麼能」。文檔已經解釋它。你建立一個罐子,並使用例如[配置文件](http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-profile-specific-properties)將其調整到所在環境它運行。 – cfrick 2014-09-03 09:38:34

+0

感謝您對第二個問題的解釋!但是--name是指什麼? Spring是app.properties中屬性的名稱嗎? – luksmir 2014-09-03 11:20:17

+0

看看你的問題中引用的行上方的代碼示例。有一個註釋'@Value(「$ {name}」)'爲一個變量。這是由道具默認填充的。在這種情況下,你可以使用'--name'來覆蓋命令行上的道具。這是一個相當合成的例子。但e.t. '--server.port = 9080'從props中覆蓋'server.port'並且更有用。 – cfrick 2014-09-03 11:24:28

回答

5

一次性測試

我發現,通常在春季啓動的背景下,「一次性測試」簡稱趨於有關切換活動的配置文件。例如,當我在本地運行我的應用程序,我通常使用這個命令:

java -jar myapp.jar --spring.profiles.active=scratch 

激活我的「從無到有」輪廓,其設置了一個內存數據庫和一些基本的測試數據導入到它。我有一個run.sh腳本,我檢查了Git,其中包括。

這就是我想在我的本地機器上玩耍時激活的配置文件。但是,對於偶爾的一次性測試,我可能希望運行我的應用程序對一個更永久的數據庫。要做到這一點我只需要調整活動的配置文件在我的命令行,像這樣......

java -jar myapp.jar --spring.profiles.active=sqlserver 

這將激活application-sqlserver.properties文件在我的config目錄下,並設置了由SQL支持本地運行春季啓動應用程序服務器數據庫這是一次性的,因爲我不打算將它用作默認的構建數據庫連接。

運行在不同的環境

這提供了使用「在不同環境中相同的應用代碼」的基礎上相同的應用程序代碼。假設您已經構建了一個Spring Boot應用程序示例,您應該已經注意到該構建會創建一個.jar文件。這個想法是,這個相同的.jar文件將被部署到所有環境。這是一個好東西,因爲如果你已經在一個環境中測試了你的應用程序,並希望推廣到生產環境,那麼你一定要確信你正在部署的代碼與你剛測試過的代碼相同?

但是,顯然你的每個環境都有不同的要求。在構建時,您可能希望使用內存數據庫。但是,在集成測試環境中,您可能需要連接到物理數據庫,如MySQL,Oracle或SQL Server。您可能有單獨的測試和生產數據庫。每個環境都可以連接到不同的RabbitMQ羣集。

Spring Boot通過外部化配置支持此功能。它會自動在您的應用程序的根目錄中查找名爲config的目錄中的屬性。即你可以創建一個像這樣的目錄結構...

myapp/ 
    config/ 
     application.properties 
    myapp.jar 

...和需要是不同的在每個環境的唯一事情是application.properties,在那裏你可以在不同的數據庫,LDAP目錄,電子郵件系統點,消息中間商或其他任何在每個環境中都不同的消息。

--name參數

如在開始--Spring Boot documentation on accessing command line properties,命令行參數提到被轉換爲應用程序屬性。因此,--name成爲您可以在應用程序中訪問的屬性。值得注意的是,啓動Spring Boot應用程序並不是必需的參數。

附註:--name在啓動'NIX命令行過程時很常用,以便您可以ps ax | grep Spring並查看您的過程。通常這樣你可以殺死它。它不是Spring Boot應用程序的必需參數,而只是您參考的示例中使用的一些參數。該示例通過@Value("${name}")註釋引用它。