在實際用中,咱們的Java服務一般要部署在不一樣的環境中,而且每一個環境有隻適用於本環境的配置文件。
例如測試環境須要鏈接測試數據庫,生產環境又會在不一樣的機房進行服務部署,須要鏈接本機房的數據庫從庫。
同時,每一個環境的配置又有不少相同的部分,好比cache的超時時間等。本文介紹如何使用maven進行多個部署環境的配置文件管理。java
對於多個運行環境的配置文件管理,比較原始的方法是爲每個部署環境建立一個配置文件:mysql
resources ├── prod_beijing_config.properties ├── prod_shanghai_config.properties ├── dev_config.properties └── config.properties
在上面的例子中咱們配置了兩個正式環境的配置文件,分別是北京機房和上海機房;配置了一個開發環境的配置文件,還有一個本地運行使用的配置文件。
在讀取配置文件的時候,經過系統變量進行選擇某一個配置文件或者在部署腳本中將不一樣機房的配置文件按照部署的環境不一樣進行上傳。sql
這樣作的問題有:數據庫
實現複雜,須要在Java程序或者在部署腳本中進行處理apache
各個部署環境公用的配置要維護多份。例如須要新增一個和部署環境無關的配置項,須要在全部的配置文件中依次添加,稍有不慎就會形成部署失敗。segmentfault
下面介紹一種使用maven進行配置文件管理的方法,能夠作到:dom
加載配置文件的過程對應用程序透明,無論在哪一個環境中都只須要加載 config.propertiesmaven
公共配置項在一個文件中維護測試
首先修改項目的config.properties,將須要根據運行環境不一樣取不一樣值的配置項目用變量代替,例如:ui
mysql.host = ${mysql.host} mysql.port = ${mysql.port} cache.size = 1000
而後在項目的根目錄上建立一個 profiles 目錄,存放全部運行環境的配置文件。
. ├── README.md ├── pom.xml ├── profiles │ ├── beijing_config.properties │ ├── shanghai_config.properties │ └── dev_config.properties ├── src │ ├── main │ │ ├── java │ │ │ └── com
注意這裏每一個機房的配置文件中只包含須要根據運行環境不一樣取不一樣值的配置項:
$ cat profiles/beijing_config.properties mysql.host = beijing.mysql.domain mysql.port = 4534 $ cat profiles/shanghai_config.properties mysql.host = shanghai.mysql.domain mysql.port = 4534 $ cat profiles/dev_config.properties mysql.host = test.mysql.host mysql.port = 4534
最關鍵的部分是pom.xml的配置:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>demo</groupId> <artifactId>demo</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> .... <profiles> <profile> <id>dev</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <build.profile.id>dev</build.profile.id> </properties> </profile> <profile> <id>beijing</id> <properties> <build.profile.id>beijing</build.profile.id> </properties> </profile> <profile> <id>shanghai</id> <properties> <build.profile.id>shanghai</build.profile.id> </properties> </profile> </profiles> <build> ... <filters> <filter>profiles/${build.profile.id}_config.properties</filter> </filters> <resources> <resource> <directory>src/main/resources/</directory> <filtering>true</filtering> </resource> </resources> ... </build> </project>
在這個pom文件中,咱們首先定義了三個profile,dev profile 中將 build.profile.id 的值設置爲 dev,beijing profile 中將 build.profile.id 的值設置爲 beijing,shanghai profile 中將 build.profile.id 的值設置爲 shanghai。
同時,這個配置中還指定了資源文件的位置是 src/main/resources/, 在生成這些資源文件的時候使用 profiles/${build.profile.id}_config.properties 中定義的變量進行內容的替換。
在打包的時候,若是咱們執行:mvn package -P beijing
, 這時首先會找到beijing的profile,將build.profile.id賦值爲beijing,
這樣定義變量的文件名就變成了 profiles/beijing_config.properties, 將config.properties 打入war包的時候會從 profiles/beijing_config.properties 中讀取 ${mysql.host}
和 ${mysql.port}
的值。最後war包中的 config.properties
就變成了:
mysql.host = beijing.mysql.domain mysql.port = 4534 cache.size = 1000
當沒有指定 -P 選項的時候,因爲 dev 這個環境配置了 <activeByDefault>true</activeByDefault>
,因此會被默認啓用。
關於配置文件的讀取,可使用Owner減小代碼量,而且支持動態加載。這裏有一個簡要的說明