在Maven的pom.xml和Spring框架中,都有profile這個概念。profile是用於區分各類環境的,例如開發環境、測試環境、正式環境等。Maven的profile常常用於在打包時根據指定環境打入不一樣的配置文件配置,如數據庫配置。Spring的Profile能夠用於在不一樣的環境下加載不一樣的bean,例如@Profile
註解。本文介紹如何將兩者整合。java
Spring啓用某個profile有多種方式,爲了便於整合Maven,這裏經過web.xml方式啓用:web
<context-param> <param-name>spring.profiles.active</param-name> <param-value>dev</param-value> </context-param>
在默認狀況下,會啓用Spring的dev profile,即開發環境。spring
在pom.xml中,能夠配置test和product兩個profile,分別對應測試環境和正式環境。這裏也能夠根據具體狀況自定義。數據庫
<profiles> <profile> <id>test</id> ... </profile> <profile> <id>product</id> ... </profile> </profiles>
此時,運行mvn clean package -Ptest
就會使用id爲test的profile內的配置打包,mvn clean package -Pproduct
就是用來打正式環境包的命令。app
在web.xml中<param-value>dev</param-value>
是指定Spring的profile,接下里要實現這個內容的替換,讓mvn clean package -Ptest
打包出來的web.xml變成<param-value>test</param-value>
。這裏可使用maven-antrun-plugin來實現字符串替換:框架
<profiles> <profile> <id>test</id> <build> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <executions> <execution> <phase>compile</phase> <configuration> <target> <!-- web.xml中的<param-value>dev</param-value>替換爲<param-value>test</param-value> --> <replace file="${basedir}/src/main/webapp/WEB-INF/web.xml" token="<param-value>dev</param-value>" value="<param-value>test</param-value>" /> </target> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </profile> <profile> <id>product</id> <build> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <executions> <execution> <phase>compile</phase> <configuration> <target> <!-- web.xml中的<param-value>dev</param-value>替換爲<param-value>product</param-value> --> <replace file="${basedir}/src/main/webapp/WEB-INF/web.xml" token="<param-value>dev</param-value>" value="<param-value>product</param-value>" /> </target> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
以上的<replace file="" token="" value="" />
中分別用於指定文件、待替換字符串、替換後的字符串。這裏爲何不寫成token="dev"
?考慮到」dev」這個字符串過短,可能會在web.xml中別的地方出現,防止誤傷,因此這裏會用token="<param-value>dev</param-value>"
。webapp
以上配置加入到pom.xml中後,再經過mvn clean package -Ptest
或mvn clean package -Pproduct
命令打包,打包好的war包解壓出來,能夠發現<param-value>dev</param-value>
被替換成了<param-value>test</param-value>
或<param-value>product</param-value>
。此時便完成了Maven和Spring的profile的整合。maven
若是使用mvn clean package -Ptest
或mvn clean package -Pproduct
打包,會形成項目中的web.xml修改替換,此時若是忘了改回來,會形成一些問題,如再次打不一樣環境的包就找不到<param-value>dev</param-value>
來replace了,還有若是此時在開發中調試會誤啓用其餘的Spring profile。測試
爲了解決這個問題,咱們能夠經過maven-antrun-plugin插件在replace前將web.xml拷貝一份出來,在拷貝出的web.xml文件上執行replace操做,打包時將拷貝出的web.xml打入war包,從而不影響原有的web.xml文件內容。優化
<profiles> <profile> <id>test</id> <properties> <!-- 使用target/web-xml中的web.xml文件打入war包 --> <maven.war.webxml>${basedir}/target/web-xml/web.xml</maven.war.webxml> </properties> <build> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <executions> <execution> <phase>compile</phase> <configuration> <target> <!-- 將web.xml拷貝一份到target/web-xml目錄下 --> <copy file="${basedir}/src/main/webapp/WEB-INF/web.xml" todir="${basedir}/target/web-xml" /> <!-- 拷貝後的web.xml中的<param-value>dev</param-value>替換爲<param-value>test</param-value> --> <replace file="${basedir}/target/web-xml/web.xml" token="<param-value>dev</param-value>" value="<param-value>test</param-value>" /> </target> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </profile> <profile> <id>product</id> <properties> <!-- 使用target/web-xml中的web.xml文件打入war包 --> <maven.war.webxml>${basedir}/target/web-xml/web.xml</maven.war.webxml> </properties> <build> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <executions> <execution> <phase>compile</phase> <configuration> <target> <!-- 將web.xml拷貝一份到target/web-xml目錄下 --> <copy file="${basedir}/src/main/webapp/WEB-INF/web.xml" todir="${basedir}/target/web-xml" /> <!-- 拷貝後的web.xml中的<param-value>dev</param-value>替換爲<param-value>product</param-value> --> <replace file="${basedir}/target/web-xml/web.xml" token="<param-value>dev</param-value>" value="<param-value>product</param-value>" /> </target> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
爲何不使用多個web.xml文件
以上是使用了一種web.xml文件字符串替換的方式來實現Maven和Spring的profile整合。另外還有一種配置多個web.xml文件的方式,即爲每一個profile拷貝一份web.xml,修改相應spring.profiles.active
的值,pom.xml中每一個profile指定對應的maven.war.webxml
將相應的web.xml打入war包。若是項目須要常常修改web.xml文件內容,每次都要修改好幾份web.xml文件會很是麻煩,因此不推薦使用。