我們在開發項目的時候,往往會有好幾個環境。比如開發、預發布(測試)、產品,每個環境一般用到配置都不一樣,最典型的就是數據庫,開發的數據庫與產品的數據庫肯定是不一樣的,如果要多個環境的切換就得改配置,這樣一來非常麻煩。然而程序員是一群非常會偷懶的家伙,於是就有了多環境配置這個功能,以上純屬我在胡說八道。。。
使用的開發工具為idea,一般來說我們都會在src/main/resources 目錄下面建一個文件夾,里面分別放三個環境對應的文件dev、pre、pro,如下:
我們實際項目中引用的配置文件是config.properties
redis.host=${redis_host}
redis.port=${redis_port}
redis.password=${redis_password}
driver=${db_driver}
url=${db_url}
username=${db_username}
password=${db_password}
把在config.properties文件中所有用到的變量都放到對於環境的文件夾中,例如dev.properties文件內容:
redis_host=127.0.0.1
redis_port=7777
redis_password=eoooxy
db_driver=com.mysql.jdbc.Driver
db_url=jdbc:mysql://localhost:3306/anhoo
db_username=root
db_password=root
做好上面的准備工作之后,就需要在pom里面進行設置了三個環境對應的變量:
<profiles> <profile> <id>dev</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <env>dev</env> <!--<redis_host>127.0.0.1</redis_host>--> </properties> </profile> <profile> <id>pre</id> <properties> <env>pre</env> </properties> </profile> <profile> <id>pro</id> <properties> <env>pro</env> </properties> </profile> </profiles>
以及在<build>節點里面添加:
<finalName>${project.artifactId}</finalName> <!-- 使用指定的filter進行過濾,在執行mvn命令的時候帶上-Ppro就代表生產環境,就會加載生產環境的properties,-Pdev就代表開發環境(默認) --> <filters> <filter>src/main/resources/properties/env/${env}.properties</filter> </filters> <!-- 資源文件位置src/main/resources/,這下面的資源文件的${}會全部被替換成filter中的標簽內容。 directory指定的value會作為classes的資源跟目錄, 比如指定:src/main/resources/,則classes下會出現jdbc等包, 若指定:src/main/resources/jdbc/,則classes下直接出現jdbc包下的文件,不會額外出現jdbc等其他包結構。因為他把jdbc作為了根目錄 --> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <!-- exclude可以排除指定文件,支持通配符 ,匹配項不會生成到classes目錄下,路徑是以directory開始的 在這里就是directory(src/main/resources/)/properties/env/pro.properties --> <!--<excludes>--> <!--<exclude>properties/env/pro.properties</exclude>--> <!--</excludes>--> </resource> </resources>
當然我們也可以把所有的變量放在pom的環境分類的properties節點里面,如被注釋的部分,這樣一來也是可以的,當然如果這樣做的話,filters部分就多此一舉了,而且我們可以直接在.xml文件中進行這些變量的引用。兩種方法效果都一樣,沒啥區別,就看個人愛好了。
打包命令:
mvn clean package -P(對應的環境的id,要把括號去掉且是緊挨着大寫的P)
這樣一來,打包好的war包,里面對應的配置就變了。。。
如果錯誤懇請指出,謝謝!!
參考:http://www.jianshu.com/p/5650e5738d30