利用mvn進行多環境配置

代碼裏的resource信息有不少,代碼裏寫死某一個環境的配置的話,有如下若干問題。spring

1. dev,不一樣的beta上,使用的resource信息不一樣。sql

2. 代碼沒有發佈到對應的環境上,須要去機器上須要手動修改。不鎖住配置文件,則每次發佈都須要手動修改;若鎖住配置文件,則代碼更新了配置文件,則機器上仍是老的配置文件。把測試的環境寫到代碼裏,容易引發配置不穩定,上線前忘了改過來可能形成問題。數據庫

3. 測試中有時日誌中沒有打出來是使用的是哪一個環境配置,發現環境不對時,查起來費時又費勁。dom

4. 環境交付其餘團隊使用時,出問題還須要支出人力配合定位問題。maven

爲了解決以上問題,咱們能夠作如下的事情。測試

1、profileui

當resource配置信息內容根據環境種類的不一樣而不一樣時,如dev和beta使用不一樣的sql數據庫鏈接配置等,使用profile來針對每一個環境配置一套resource。pmo中加入:日誌

<profiles>
        <!-- 打包開發環境 -->
        <profile>
            <id>dev</id>
            <activation>
                <property>
                    <name>hello.dev</name>
                    <value>dev</value>
                </property>
            </activation>
            <build>
                <resources>
                    <resource>
                        <directory>${profiles.dir}/dev</directory>
                    </resource>
                </resources>
            </build>
        </profile>
        <!-- 打包beta環境 -->
        <profile>
            <id>hello.beta</id>
            <activation>
                <property>
                    <name>hello.beta</name>
                    <value>beta</value>
                </property>
            </activation>
            <build>
                <resources>
                    <resource>
                        <directory>${profiles.dir}/beta</directory>
                    </resource>
                </resources>
            </build>
        </profile>
</profiles>

  指定dev和beta分別使用的resource目錄。咱們在profiles.dir裏準備好對應的resource配置便可。發佈時,使用maven命令激活相應的環境便可:mvn -P beta 即便用了beta的profile。xml

2、filterblog

有時,同一種環境,只是域名不一樣,可使用filter來進行變量替換。如,環境A1上,域名應是xxxA1.beta.com; 環境A2上,域名應是xxxA2.beta.com。pmo上配置:

<profile>
            <id>beta</id>
            <activation>
                <property>
                    <name>hello.beta</name>
                    <value>beta</value>
                </property>
            </activation>
            <build>
                <filters>
                    <filter>src/main/filters/beta.properties</filter>
                </filters>
                <resources>
                    <resource>
                        <directory>${profiles.dir}/beta</directory>
                        <filtering>true</filtering>
                        <includes>
                            <include>**/*.properties</include>
                            <include>**/*.config</include>
                            <include>**/*.xml</include>
                        </includes>
                    </resource>
                </resources>
            </build>
        </profile>

  配置裏說,${profiles.dir}/beta裏符合條件的文件,須要被filter裏配置的文件裏的參數進行替換。filter配置src/main/filters/beta.properties裏的文件怎麼寫呢?

all.use.A.domain=xxxA1.beta.com
all.use.B.domain=xxxB1.beta.com

  看到filter文件裏,配置了A服務對應的域名是xxxA1.beta.com。就是說,resource文件裏,遇到${all.use.A.domain}這個變量時,即替換爲xxxA1.beta.com。

以上是默認的配置,在編譯的時候,使用命令:mvn -Pbeta clean package -Dall.use.A.domain=xxxA2.beta.com,則在編譯的時候,會將xxxA2.beta.com這個內容替換到resource裏${all.use.A.domain}的變量處。

 注意與profile下配置文件裏的變量的區別。在filter文件裏的變量,在編譯時,會替換掉原文件中的值。而在profile配置文件中定義的變量,不會替換代碼裏的變量佔用號,發佈機器上,還是變量符號。

好比,resources文件spring-dubbo-consumer.xml裏,配置文件內容爲:

<dubbo:registry id="ordercenter_core" protocol="zookeeper" address="${dubbo.zk}" group="${core_dubbo_group}"></dubbo:registry>

  

其中,${dubbo.zk}這個變量內容定義在profiles下的文件中,內容爲dubbo.zk=l-zk.beta.com:8888。代碼發佈到測試上後,查看spring-dubbo-consumer.xml,內容不變。變量替換是在服務執行時完成的。

相關文章
相關標籤/搜索