日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

maven学习(下)利用Profile构建不同环境的部署包

發布時間:2025/6/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 maven学习(下)利用Profile构建不同环境的部署包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

接上回繼續,項目開發好以后,通常要在多個環境部署,象我們公司多達5種環境:本機環境(local)、(開發小組內自測的)開發環境(dev)、(提供給測試團隊的)測試環境(test)、預發布環境(pre)、正式生產環境(prod),每種環境都有各自的配置參數,比如:數據庫連接、遠程調用的ws地址等等。如果每個環境build前手動修改這些參數,顯然太不fashion.

maven早就考慮到了這些問題,看下面的pom片段:

<profiles><profile><!--?本地環境?--><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><!--?開發環境?--><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><!--?默認激活本環境?--><activation><activeByDefault>true</activeByDefault></activation></profile>...</profiles>

profiles節點中,定義了二種環境:local、dev(默認激活dev環境),可以在各自的環境中添加需要的property值,接下來修改build節點,參考下面的示例:

<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節點是關鍵,它表明了哪個目錄下的配置文件(不管是xml配置文件,還是properties屬性文件),需要根據profile環境來替換屬性值。

通常配置文件放在resources目錄下,build時該目錄下的文件都自動會copy到class目錄下

以上圖為例,其中spring-database.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"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>

各屬性節點的值,用占位符"${屬性名}"占位,maven在package時,會根據profile的環境自動替換這些占位符為實際屬性值。

默認情況下:?

maven package

將采用默認激活的profile環境來打包,也可以手動指定環境,比如:

maven package?-P dev

將自動打包成dev環境的部署包(注:參數P為大寫)

?

最后再給2個實例的運用例子:

1、開發環境與生產環境數據源采用不同方式的問題

本機開發時為了方便,很多開發人員喜歡直接用JDBC直接連接數據庫,這樣修改起來方便;

<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>

而生產環境,通常是在webserver(比如weblogic上)配置一個JNDI數據源,

<bean?id="dataSource"?class="org.springframework.jndi.JndiObjectFactoryBean"><property?name="jndiName"?value="appDS"?/> </bean>

如果每次發布生產前,都要手動修改,未免太原始,可以通過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里類似下面設置

<profile><!--?本機環境?--><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><!--?默認激活本環境?--><activation><activeByDefault>true</activeByDefault></activation></profile>????????<profile><!--?生產環境?--><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打包本地開發環境時,將生成

<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>

而打包生產環境 mvn clean package -P pro時,生成

<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配置的其它跟數據庫相關的bean,約定引用dataSource這個名稱的bean即可

?

2、不同webserver環境,依賴jar包,是否打包的問題

weblogic上,允許多個app,把共用的jar包按約定打包成一個war文件,以library的方式部署,然后各應用在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 的名稱即可。這樣的好處是,即節省了服務器開銷,而且各app打包時,就不必再重復打包這些jar文件,打包后的體積大大減少,上傳起來會快很多。

而其它webserver上卻未必有這個機制,一般為了方便,我們開發時,往往采用一些輕量級的webserver,比如:tomcat,jetty,jboss 之類,正式部署時才發布到weblogic下,這樣帶來的問題就是,本機打包時,要求這些依賴jar包,全打包到app的WEB-INF/lib下;而生產環境下,各應用的WEB-INF/lib下并不需要這些jar文件,同樣還是用profile來搞定,先處理pom.xml,把依賴項改成類似下面的形式:

<dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version><scope>${jar.scope}</scope></dependency>

即scope這里,用一個占位符來代替,然后profile這樣配置

<profile><!--?本機環境?--><id>local</id><properties><jar.scope>compile</jar.scope>...</properties><!--?默認激活本環境?--><activation><activeByDefault>true</activeByDefault></activation></profile><profile><!--?生產環境?--><id>pro</id><properties><jar.scope>provided</jar.scope>...</properties></profile>

在maven里,如果一個依賴項的scope是provided,表示由容器提供,打包時將不會打包進最終的package里,所以這樣配置后,生產環境打包時,依賴項的scope全變成了provided,即不打包進war文件,而本機環境下,因為scope是compile,所以會打包到war里


轉載于:https://my.oschina.net/u/1866821/blog/464183

總結

以上是生活随笔為你收集整理的maven学习(下)利用Profile构建不同环境的部署包的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。