使用maven的profile切換專案各環境的引數
在實際開發專案中,常常有幾種環境,一般情況下最少有三種環境:開發、測試、正式。
各個環境之間的引數各不相同,比如mysql、redis等不同環境的host不一樣,若每個環境都手動替換環境很容易出錯,這裡我們利用maven的profile功能切換環境。
本文的專案結構圖:
src/main/resources/dev 目錄的properties是開發環境的配置專案
src/main/resources/test 目錄的properties是測試環境的配置專案
在pom.xml定義環境的profile
- <profiles>
- <profile>
- <id>dev</id>
- <properties>
- <profiles.activation>dev</profiles.activation>
- </properties>
- <activation>
- <activeByDefault>true</activeByDefault>
- </activation>
- </profile>
- <profile>
- <id>test</id>
- <properties>
- <profiles.activation>test</profiles.activation>
- </properties>
- </profile>
- </profiles>
activeByDefault標籤的值為true的話表示預設的profile,使用mvn install命令起作用的就是它,這裡為dev
resources標籤定義要包含的資源,在下面的配置下package階段會把resources資料夾裡的 ${profiles.activation}/* 檔案打包
這裡的${profiles.activation}由命令maven的-P選項指定,例:mvn install -Ptest 就是打包 test/* 即test目錄下的所有檔案
- <resources>
- <resource>
- <directory>src/main/resources</directory>
- <!-- **/*.properties 是指包括根目錄或子目錄所有properties型別的檔案 -->
- <includes>
- <include>**/*.properties</include>
- <include>**/*.xml</include>
- </includes>
- <!-- 排除dev、test目錄下的檔案 -->
- <excludes>
- <exclude>dev/*</exclude>
- <exclude>test/*</exclude>
- </excludes>
- </resource>
- <resource>
- <directory>src/main/resources</directory>
- <!-- 包含,若沒有指定則預設為 activeByDefault 標籤定義的profile -->
- <includes>
- <include>${profiles.activation}/*</include>
- </includes>
- </resource>
- </resources>
applicationContext.xml檔案如下
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd" default-autowire="byType">
- <!-- Annotation Config -->
- <context:annotation-config/>
- <!-- 取${profiles.activation:dev}表示取${profiles.activation}的值,若沒有則指定dev -->
- <bean id="propertyConfig"
- class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="locations">
- <list>
- <value>classpath:${profiles.activation:dev}/jdbc.properties</value>
- </list>
- </property>
- </bean>
- <!-- ==============配置資料來源============== -->
- <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.username}" />
- <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" />
- </bean>
- </beans>
這裡取${profiles.activation:dev}是取${profiles.activation}的值,若不存在,則預設為dev;
若值為dev,locations的值為classpath:dev/jdbc.properties。
${profiles.activation}是在web.xml裡的context-param取值
- <context-param>
- <param-name>profiles.activation</param-name>
- <param-value>${profiles.activation}</param-value>
- </context-param>
值得注意的是,${profiles.activation}由於有預設值的存在,applicationContext.xml不需要啟動web容器去讀取web.xml中的${profiles.activation},
這有效的保障了使用JUnit進行單元測試,也就是說在maven的test目錄裡的測試用例可以正常執行。
現在的問題就成了如何把maven裡啟用的profile值傳進來,使用maven-war-plugin能在maven install的時期會設定web.xml佔位符值${}的值
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-war-plugin</artifactId>
- <configuration>
- <warName>${profiles.activation}</warName>
- <!-- 啟用spring profile -->
- <webResources>
- <resource>
- <filtering>true</filtering>
- <directory>src/main/webapp</directory>
- <includes>
- <include>**/web.xml</include>
- </includes>
- </resource>
- </webResources>
- <warSourceDirectory>src/main/webapp</warSourceDirectory>
- <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
- </configuration>
- </plugin>
所有檔案配置完畢,使用 mvn install -P{profile} 命令打包war
example:
1、mvn install 沒有指定profile,預設為dev
2、mvn install -Ptest -Dmaven.test.skip=true 指定profile為test並跳過測試
在使用tomcat部署時,先使用maven的命令切換至目標環境,然後tomcat的目標目錄設定為編譯後的target/${project.actifact}目錄(大多數IDE比如eclipse和IDEA都是這樣)
相關文章
- 使用 Maven Profile 和 Filtering 打各種環境的包MavenFilter
- yml檔案中使用profile配置切換多環境
- maven 使用maven profile實現多環境可移植構建Maven
- 多環境支援-Maven和Spring的ProfileMavenSpring
- AIX環境oracle使用者的.profile檔案(轉)AIOracle
- RAC環境STANDBY的SWITCHOVER切換
- RAC環境的物理STANDBY的 SWITCHOVER切換
- RAC環境STANDBY的FAILOVER切換AI
- Spring Boot配合Maven的Profile機制完成環境適配Spring BootMaven
- maven學習(下)利用Profile構建不同環境的部署包Maven
- Maven專案多環境構建的最小配置方案指南Maven
- maven中的profile檔案的解析Maven
- 含有replication環境的sqlserver切換到standbySQLServer
- RAC環境LOGICAL STANDBY的SWITCHOVER切換
- 【轉載】MAVEN環境變數配置及安裝及專案配置Maven變數
- pycharm切換conda環境PyCharm
- Pytest 如何使用切換被測試環境
- webpack介面環境切換的配置-超簡單Web
- RAC環境LOGICAL STANDBY的FAILOVER切換AI
- Linux系統環境變數檔案解析(etc/profile ,/etc/bashrc ,~/.bash_profile)Linux變數
- Windows環境下無縫切換Listener log檔案Windows
- Unix環境和Windows環境下Oracle引數檔案位置:WindowsOracle
- Jenkins 2.32.3引數化構建maven專案-java專案JenkinsMavenJava
- MAVEN中的profileMaven
- jenkins動態切換環境Jenkins
- Oracle RAC 環境 引數檔案的啟動順序Oracle
- linux系統環境變數.bash_profile/bashrc檔案Linux變數
- 通過配置 Xcode 的設定選項實現 Swift 專案中 API 環境快捷切換XCodeSwiftAPI
- 使用 Postman 的 Environments 和 Tests 簡化在不同環境中的切換步驟Postman
- Maven 學習筆記——將普通的Java專案轉換成Maven專案(3)Maven筆記Java
- vue 構建環境切換指令碼Vue指令碼
- app 測試環境切換問題APP
- Laravel env 設定多環境切換Laravel
- 關於使用springboot的application.yml切換dev配置環境Spring BootAPPdev
- jupyter notebook中 切換不同的Python環境Python
- Oracle引數檔案 各引數解釋Oracle
- Maven基礎:Maven環境搭建及基本使用(1)Maven
- window環境下安裝和切換兩個python環境Python