maven学习(下)利用Profile构建不同环境的部署包
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
接上回繼續(xù),項(xiàng)目開發(fā)好以后,通常要在多個(gè)環(huán)境部署,象我們公司多達(dá)5種環(huán)境:本機(jī)環(huán)境(local)、(開發(fā)小組內(nèi)自測的)開發(fā)環(huán)境(dev)、(提供給測試團(tuán)隊(duì)的)測試環(huán)境(test)、預(yù)發(fā)布環(huán)境(pre)、正式生產(chǎn)環(huán)境(prod),每種環(huán)境都有各自的配置參數(shù),比如:數(shù)據(jù)庫連接、遠(yuǎn)程調(diào)用的ws地址等等。如果每個(gè)環(huán)境build前手動(dòng)修改這些參數(shù),顯然太不fashion.
maven早就考慮到了這些問題,看下面的pom片段:
<profiles><profile><!--?本地環(huán)境?--><id>local</id><properties>????????????????<db-url>jdbc:oracle:thin:@localhost:1521:XE</db-url><db-username>***</db-username><db-password>***</db-password></properties></profile><profile><!--?開發(fā)環(huán)境?--><id>dev</id><properties>????????????????<db-url>jdbc:oracle:thin:@172.21.129.51:1521:orcl</db-url><db-username>***</db-username><db-password>***</db-password></properties><!--?默認(rèn)激活本環(huán)境?--><activation><activeByDefault>true</activeByDefault></activation></profile>...</profiles>profiles節(jié)點(diǎn)中,定義了二種環(huán)境:local、dev(默認(rèn)激活dev環(huán)境),可以在各自的環(huán)境中添加需要的property值,接下來修改build節(jié)點(diǎn),參考下面的示例:
<build><resources><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.5.1</version><configuration><source>1.6</source><target>1.6</target><encoding>utf-8</encoding></configuration></plugin></plugins></build>resource節(jié)點(diǎn)是關(guān)鍵,它表明了哪個(gè)目錄下的配置文件(不管是xml配置文件,還是properties屬性文件),需要根據(jù)profile環(huán)境來替換屬性值。
通常配置文件放在resources目錄下,build時(shí)該目錄下的文件都自動(dòng)會(huì)copy到class目錄下
以上圖為例,其中spring-database.xml的內(nèi)容為:
<?xml?version="1.0"?encoding="UTF-8"?> <beans?xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans.xsd"><bean?id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property?name="driverClassName"?value="oracle.jdbc.driver.OracleDriver"?/><property?name="url"?value="${db-url}"?/><property?name="username"?value="${db-username}"?/><property?name="password"?value="${db-password}"?/>????????</bean> </beans>各屬性節(jié)點(diǎn)的值,用占位符"${屬性名}"占位,maven在package時(shí),會(huì)根據(jù)profile的環(huán)境自動(dòng)替換這些占位符為實(shí)際屬性值。
默認(rèn)情況下:?
maven package
將采用默認(rèn)激活的profile環(huán)境來打包,也可以手動(dòng)指定環(huán)境,比如:
maven package?-P dev
將自動(dòng)打包成dev環(huán)境的部署包(注:參數(shù)P為大寫)
?
最后再給2個(gè)實(shí)例的運(yùn)用例子:
1、開發(fā)環(huán)境與生產(chǎn)環(huán)境數(shù)據(jù)源采用不同方式的問題
本機(jī)開發(fā)時(shí)為了方便,很多開發(fā)人員喜歡直接用JDBC直接連接數(shù)據(jù)庫,這樣修改起來方便;
<bean?id="dataSource"?class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property?name="driverClassName"?value="oracle.jdbc.driver.OracleDriver"?/><property?name="url"?value="${db-url}"?/><property?name="username"?value="${db-username}"?/><property?name="password"?value="${db-password}"?/><property?name="defaultAutoCommit"?value="false"?/><property?name="initialSize"?value="2"?/><property?name="maxActive"?value="10"?/><property?name="maxWait"?value="60000"?/> </bean>而生產(chǎn)環(huán)境,通常是在webserver(比如weblogic上)配置一個(gè)JNDI數(shù)據(jù)源,
<bean?id="dataSource"?class="org.springframework.jndi.JndiObjectFactoryBean"><property?name="jndiName"?value="appDS"?/> </bean>如果每次發(fā)布生產(chǎn)前,都要手動(dòng)修改,未免太原始,可以通過maven的profile來解決
先把配置文件改成?
<bean?id="${db-source-jdbc}"?class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property?name="driverClassName"?value="oracle.jdbc.driver.OracleDriver"?/><property?name="url"?value="${db-url}"?/><property?name="username"?value="${db-username}"?/><property?name="password"?value="${db-password}"?/><property?name="defaultAutoCommit"?value="false"?/><property?name="initialSize"?value="2"?/><property?name="maxActive"?value="10"?/><property?name="maxWait"?value="60000"?/></bean><bean?id="${db-source-jndi}"?class="org.springframework.jndi.JndiObjectFactoryBean"><property?name="jndiName"?value="appDS"?/>????????</bean>即用占位符來代替bean的id,然后在pom.xml里類似下面設(shè)置
<profile><!--?本機(jī)環(huán)境?--><id>local</id><properties>...<db-source-jdbc>dataSource</db-source-jdbc><db-source-jndi>NONE</db-source-jndi><db-url>jdbc:oracle:thin:@172.21.129.51:1521:orcl</db-url>????????????????<db-username>mu_fsu</db-username><db-password>mu_fsu</db-password>...</properties><!--?默認(rèn)激活本環(huán)境?--><activation><activeByDefault>true</activeByDefault></activation></profile>????????<profile><!--?生產(chǎn)環(huán)境?--><id>pro</id><properties>...<db-source-jdbc>NONE</db-source-jdbc><db-source-jndi>dataSource</db-source-jndi>...</properties></profile> </profiles>這樣,mvn clean package -P local打包本地開發(fā)環(huán)境時(shí),將生成
<bean?id="dataSource"?class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property?name="driverClassName"?value="oracle.jdbc.driver.OracleDriver"?/><property?name="url"?value="jdbc:oracle:thin:@172.21.129.***:1521:orcl"?/><property?name="username"?value="***"?/><property?name="password"?value="***"?/><property?name="defaultAutoCommit"?value="false"?/><property?name="initialSize"?value="2"?/><property?name="maxActive"?value="10"?/><property?name="maxWait"?value="60000"?/></bean><bean?id="NONE"?class="org.springframework.jndi.JndiObjectFactoryBean"><property?name="jndiName"?value="appDS"?/>????????</bean>而打包生產(chǎn)環(huán)境 mvn clean package -P pro時(shí),生成
<bean?id="NONE"?class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property?name="driverClassName"?value="oracle.jdbc.driver.OracleDriver"?/><property?name="url"?value="${db-url}"?/><property?name="username"?value="${db-username}"?/><property?name="password"?value="${db-password}"?/><property?name="defaultAutoCommit"?value="false"?/><property?name="initialSize"?value="2"?/><property?name="maxActive"?value="10"?/><property?name="maxWait"?value="60000"?/></bean><bean?id="dataSource"?class="org.springframework.jndi.JndiObjectFactoryBean"><property?name="jndiName"?value="appDS"?/>????????</bean>spring配置的其它跟數(shù)據(jù)庫相關(guān)的bean,約定引用dataSource這個(gè)名稱的bean即可
?
2、不同webserver環(huán)境,依賴jar包,是否打包的問題
weblogic上,允許多個(gè)app,把共用的jar包按約定打包成一個(gè)war文件,以library的方式部署,然后各應(yīng)用在WEB-INF/weblogic.xml中,用類似下面的形式
<?xml?version="1.0"?encoding="utf-8"?> <weblogic-web-app?xmlns="http://www.bea.com/ns/weblogic/90">...<library-ref><library-name>my-share-lib</library-name></library-ref> </weblogic-web-app>指定共享library 的名稱即可。這樣的好處是,即節(jié)省了服務(wù)器開銷,而且各app打包時(shí),就不必再重復(fù)打包這些jar文件,打包后的體積大大減少,上傳起來會(huì)快很多。
而其它webserver上卻未必有這個(gè)機(jī)制,一般為了方便,我們開發(fā)時(shí),往往采用一些輕量級的webserver,比如:tomcat,jetty,jboss 之類,正式部署時(shí)才發(fā)布到weblogic下,這樣帶來的問題就是,本機(jī)打包時(shí),要求這些依賴jar包,全打包到app的WEB-INF/lib下;而生產(chǎn)環(huán)境下,各應(yīng)用的WEB-INF/lib下并不需要這些jar文件,同樣還是用profile來搞定,先處理pom.xml,把依賴項(xiàng)改成類似下面的形式:
<dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version><scope>${jar.scope}</scope></dependency>即scope這里,用一個(gè)占位符來代替,然后profile這樣配置
<profile><!--?本機(jī)環(huán)境?--><id>local</id><properties><jar.scope>compile</jar.scope>...</properties><!--?默認(rèn)激活本環(huán)境?--><activation><activeByDefault>true</activeByDefault></activation></profile><profile><!--?生產(chǎn)環(huán)境?--><id>pro</id><properties><jar.scope>provided</jar.scope>...</properties></profile>在maven里,如果一個(gè)依賴項(xiàng)的scope是provided,表示由容器提供,打包時(shí)將不會(huì)打包進(jìn)最終的package里,所以這樣配置后,生產(chǎn)環(huán)境打包時(shí),依賴項(xiàng)的scope全變成了provided,即不打包進(jìn)war文件,而本機(jī)環(huán)境下,因?yàn)閟cope是compile,所以會(huì)打包到war里
轉(zhuǎn)載于:https://my.oschina.net/u/1866821/blog/464183
總結(jié)
以上是生活随笔為你收集整理的maven学习(下)利用Profile构建不同环境的部署包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sublime text 心得
- 下一篇: 膝盖中了一箭