【原創(chuàng)申明:文章為原創(chuàng),歡迎非盈利性轉(zhuǎn)載,但轉(zhuǎn)載必須注明來(lái)源】
在互聯(lián)網(wǎng)產(chǎn)品中,一般會(huì)有多個(gè)項(xiàng)目(Jar、WAR)組成一個(gè)產(chǎn)品線。這些WAR項(xiàng)目,因?yàn)槭褂孟嗤那岸思軜?gòu)(jQuery、easyui等),在各個(gè)項(xiàng)目中都會(huì)存在這些組件的代碼,以及其他各個(gè)項(xiàng)目中都要用到的公共資源文件。
傳統(tǒng)的做法,在每個(gè)War項(xiàng)目中拷貝一份這些文件,分別打包到各個(gè)War中。如果這些組件非常穩(wěn)定,很少升級(jí),也幾乎不存在BUG需要修改,這么做問(wèn)題也不大。但如果是相反的情況,前端人員就要忙瘋了,因?yàn)樗诟鱾€(gè)項(xiàng)目中進(jìn)行修改調(diào)試,而且還要記住哪些項(xiàng)目修改了,哪些還沒(méi)修改。
針對(duì)這一類問(wèn)題,有什么比較好的處理方法嗎?
1 靜態(tài)文件從War包中獨(dú)立
不管后續(xù)采用哪種方案,這都是必須要做的一個(gè)步驟。區(qū)別在于獨(dú)立出來(lái)的這些靜態(tài)文件,采用哪種方法組成一個(gè)獨(dú)立的module。
我們項(xiàng)目中典型的static目錄內(nèi)容如下,其他項(xiàng)目基本類似。
可以看到,其中包括jquery\easyui的代碼將會(huì)在各個(gè)項(xiàng)目中重復(fù)出現(xiàn)。
2 將靜態(tài)文件作為獨(dú)立jar包開發(fā)
將資源文件獨(dú)立出來(lái)后,使用一個(gè)獨(dú)立的jar包進(jìn)行開發(fā);其他war項(xiàng)目依賴這個(gè)jar包。
2.1 靜態(tài)文件jar項(xiàng)目
在項(xiàng)目的src/main/resources目錄中創(chuàng)建static目錄,并將公共靜態(tài)文件復(fù)制到該目錄中。
修改pom.xml文件,配置私有maven庫(kù)的地址和用戶信息,這樣mvn deploy可以自動(dòng)將jar發(fā)布到maven庫(kù),供其它war項(xiàng)目使用。
2.2 War包項(xiàng)目引用
首先修改pom.xml,添加dependency。
<dependency>
<groupId>cn.codestory.research</groupId>
<artifactId>common-static</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
然后修改spring配置文件中的mvc:resources部分為
<mvc:resources mapping="/static/**" location="classpath:/static/" />
頁(yè)面引用靜態(tài)文件時(shí),直接使用代碼
<script type="text/javascript" src='/static/javascript/framework/jquery.min.js'></script>
<script type="text/javascript" src='/static/javascript/framework/jquery.easyui.min.js'></script>
這樣就能正常訪問(wèn)jar包中的靜態(tài)文件。
如果war包中需要添加本項(xiàng)目特有的靜態(tài)文件,或者是對(duì)jar中的部分靜態(tài)文件做修改適應(yīng)本項(xiàng)目的需要,可以保存在war項(xiàng)目的目錄中/src/main/resources/static中,其他代碼都不需要修改。
如果原war中的靜態(tài)文件保存在src/main/webapp/static目錄中并且不想移動(dòng)這些文件,修改spring配置文件中的mvc:resources內(nèi)容為
<mvc:resources mapping="/static/**" location="classpath:/static/,/static/" />
2.3 小結(jié)
這種修改方法,不修改項(xiàng)目的部署方式就能實(shí)現(xiàn)靜態(tài)文件的共享。只是它需要構(gòu)建一個(gè)私有Maven倉(cāng)庫(kù),在項(xiàng)目之間共享才比較方便。
前端修改代碼時(shí),只需要在common-static.jar項(xiàng)目中修改即可。當(dāng)然,因?yàn)樯婕暗礁嗟捻?xiàng)目,修改也一定要慎重。這可以通過(guò)升級(jí)jar版本號(hào)的方法來(lái)實(shí)現(xiàn)各個(gè)war項(xiàng)目的逐漸升級(jí)。
3 靜態(tài)文件作為獨(dú)立WAR,依靠部署來(lái)實(shí)現(xiàn)
在生產(chǎn)環(huán)境,將靜態(tài)文件獨(dú)立部署到一臺(tái)服務(wù)器,采用Tomcat或Http Server。有兩種方案可以實(shí)現(xiàn)static文件的轉(zhuǎn)發(fā)。
3.1 nginx根據(jù)URI地址進(jìn)行轉(zhuǎn)發(fā)
這種方式對(duì)項(xiàng)目的修改比較少,也不需要增加新的域名,下圖中可設(shè)置轉(zhuǎn)發(fā)規(guī)則:
1、uri是/static/**,則一律轉(zhuǎn)發(fā)到static server
2、host是app1.codestory.cn,轉(zhuǎn)發(fā)到app server 1
3、host是app2.codestory.cn,轉(zhuǎn)發(fā)到app server 2
3.2 靜態(tài)文件服務(wù)器申請(qǐng)獨(dú)立域名
部署方案跟前面類似,區(qū)別在于轉(zhuǎn)發(fā)規(guī)則的設(shè)置。同時(shí),在war包中的script引用路徑必須包括host的完整URL。
<script type="text/javascript"
src='http://static.codestory.cn/static/javascript/framework/jquery.min.js'></script>
?
3.3 應(yīng)用CDN部署靜態(tài)文件項(xiàng)目
更進(jìn)一步的解決方案,是使用CDN部署,將靜態(tài)文件部署到全國(guó)各地的機(jī)房,用戶能夠自動(dòng)訪問(wèn)就近的服務(wù)器,能提供更高的訪問(wèn)速度。
不過(guò),這個(gè)方案就完全是部署的問(wèn)題了,項(xiàng)目有需要且公司有錢的可以去嘗試。