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,就可以根據不同環境打不同的包了