1. 程式人生 > >Maven根據Profile讀取不同配置環境配置檔案

Maven根據Profile讀取不同配置環境配置檔案

開發需求:在日常開發中,我們大多都會有開發環境(dev)、測試環境(test)、生產環境(product),不同環境的引數肯定不一樣,我們需要在打包的時候,不同環境打不同當包,如果手動改,一方面效率低,容易出錯,而且每次打包都改動,麻煩,所以Maven給我們提供了profile的配置

先貼一段程式碼,然後後面講一些概念

1、首先需求就是有三個環境,每個環境的配置引數不一樣,希望在打包的時候,不同環境用的配置資料不一樣

2、配置檔案

#這是dev環境配置
jdbc_url=jdbc:mysql://127.0.0.1:3306/abcdev
jdbc_user=root
jdbc_password=root

#這是test環境配置
jdbc_url=jdbc:mysql://192.168.1.180:3306/abcdev
jdbc_user=test_user
jdbc_password=test_password

#這是product環境配置
jdbc_url=jdbc:mysql://10.6.8.30:3306/abcdev
jdbc_user=product_user
jdbc_password=product_password

下面是spring 資料庫連線配置中一段程式碼,其中資料庫連線url, username, password用${key}這種方式

 <!-- 建立資料庫連線 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 資料庫驅動 -->
        <!-- 基本屬性 url、user、password -->
        <property name="url" value="${jdbc_url}" />
        <property name="username" value="${jdbc_user}" />
        <property name="password" value="${jdbc_password}" />

        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="1" />
        <property name="minIdle" value="1" />
        <property name="maxActive" value="20" />

        <!-- 配置獲取連線等待超時的時間 -->
        <property name="maxWait" value="60000" />

        <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />

        <!-- 配置一個連線在池中最小生存的時間,單位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000" />

        <property name="validationQuery" value="SELECT 'x'" />
        <property name="testWhileIdle" value="true" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />

        <!-- 開啟PSCache,並且指定每個連線上PSCache的大小 -->
        <property name="poolPreparedStatements" value="true" />
        <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />

        <!-- 配置監控統計攔截的filters -->
        <property name="filters" value="stat" />

    </bean>

3、pom一些配置
<profiles>
        <profile>
            <id>dev</id>
            <properties>
                <profiles.active>dev</profiles.active>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <filters>
                    <filter>src/main/resources/dev.properties</filter>
                </filters>
            </build>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <profiles.active>test</profiles.active>
            </properties>
            <build>
                <filters>
                    <filter>src/main/resources/test.properties</filter>
                </filters>
            </build>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <profiles.active>prod</profiles.active>
            </properties>
            <build>
                <filters>
                    <filter>src/main/resources/prod.properties</filter>
                </filters>
            </build>
        </profile>
    </profiles>

<build>
        <finalName>myweb</finalName>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*</include>
                </includes>
                <filtering>true</filtering>
                <excludes>
                    <exclude>application-text.xml</exclude>
                    <!--<exclude>src/main/resources/application-text.xml</exclude>-->
                </excludes>
            </resource>
        </resources>
        <!--<filters>-->
            <!--<filter>src/main/resources/${profiles.active}.properties</filter>-->
        <!--</filters>-->
    </build>

4、最終,執行一個命令,mvn clean package ,我們看下編譯後target下面的採用${key}有沒有替換

我們看到已經替換為dev的資料庫連線,如果想打test的包呢,很簡單: mvn clean package -Ptest

好,到此為止,滿足了我們的一個基本需求,我們來重點看看pom中的上面貼的配置

分析profile相關概念


1、profiles:定義各個環境的變數配置,我上面的程式碼中有三個環境,所以配了3個profile

     <id>:profile的標示

    <properties>:自己定義的一些屬性,可有可無,比如我配置的jdbc.url這些屬性,如果不想通過properties定義這些,可以在改屬性下面配置

    <filters>比較重要,指定當前profile環境下,屬性檔案路徑;

分析build下屬性

我們分析下<resource>下面的屬性

<directory>: 配置那個目錄下的檔案通過${key}會被替換成屬性值,resource目錄下,我們一般放jdbc連線,或配置檔案

<includes>:指定那個目錄下那個檔案

<filtering>:這個配置的意思是過濾上面指定屬性檔案中的佔位符,佔位符是${變數名稱}這樣的形式,maven會自動讀取配置檔案,然後解析其中的佔位符,使用上面pom檔案中定義的屬性進行替換

<exclueds>:在resource目錄下,有很多檔案,但用些檔案不希望替換,則可以通過<excluede>指定

<filters>:這裡的filters與<profile>的filter意思一樣,都是指屬性檔案地址,這個如果上面定義<profile>的時候指定了,這裡就不需要了,但有些開發習慣是在<profile>不定義,然後在<build>裡指定。

好了,只有簡單配置這些,在使用maven命令的時候 mvn clean package -PprofileId ,就可以根據不同環境打不同的包了