工程化专题之Maven(下)
前言
《工程化專題之Maven(上)》
本文是工程化專題之Maven的下篇,主要涵蓋的是Maven的Profile/Filter特性,多模塊開發(fā)以及私服等內(nèi)容。
?
不同環(huán)境使用不同配置:Profile+Filter
在實際開發(fā)場景下,我們必然會存在多套環(huán)境:測試環(huán)境、開發(fā)環(huán)境、線上環(huán)境等。在不同環(huán)境下,我們就會有多套配置文件,比如數(shù)據(jù)源配置。
我們期望的是,不論部署到什么環(huán)境,不必修改代碼,不必修改配置。
很慶幸的是,Maven提供了一個方便的解決方案:Profile功能。
給大家演示個小demo:
工程結(jié)構(gòu)對于多套環(huán)境而言,我們可以抽取出相同的部分,放入到公共的文件當(dāng)中,把那些跟著環(huán)境變化而變化的配置信息,分環(huán)境存放,最后根據(jù)選擇的環(huán)境而將那部分配置信息動態(tài)注入到公共的文件當(dāng)中。(比如db.properties和filter/db-xxx.properties)
當(dāng)然,我們也可以建立多個目錄,每一個目錄表示一個環(huán)境,那么選擇一套環(huán)境,就讓這個目錄下的資源文件生效。(比如xxx/config.xml)
Profile定義:
ProfileIDEA Maven插件:
選擇Profile如pom.xml所示,通過profile定義了dev、release、test這3套環(huán)境。注意在<profile>中通過<properties>進(jìn)行了自定義屬性。
Maven屬性的概念?
Maven有一套自己內(nèi)置的屬性,比如${basedir},${project.xxx},Java相關(guān),操作系統(tǒng)相關(guān)等,這些可以直接在pom.xml中進(jìn)行引用;用戶也可以通過<properties>來自定義屬性,比如上面的例子,我們就可以在pom.xml中通過${profiles.active}來指明用戶選擇的profile。
注意,可以指定默認(rèn)的profile。
選擇Profile進(jìn)行打包?
實質(zhì)上就是在執(zhí)行mvn package -Pxxx而已。
我們來具體看一眼配置文件的內(nèi)容信息:
配置文件信息這里,我們需要重點注意的是:
在db.properties中,我們通過${jdbc.username}進(jìn)行了引用,而jdbc.username是在db-xxx.properties中定義的。
說白了,現(xiàn)在,我們要讓db-xxx.properties中的KEY成為變量,并進(jìn)行替換db.properties這個資源文件中的內(nèi)容。
filter配置:
filter配置第一,我們通過filter來指定變量配置文件的地址,要通過profile變量進(jìn)行動態(tài)選擇;
第二,要知道默認(rèn)Maven資源文件的打包,就是COPY一份資源文件到默認(rèn)的輸出目錄,一般就是classes下,現(xiàn)在必須讓資源文件可以進(jìn)行變量替換,因此開啟過濾功能;
第三,在圖中配置,通過exclude排除了filter資源目錄下的文件,也就是最后打包里面沒有filter目錄下的文件;
第四:要么使用絕對路徑,那就要使用到Maven的內(nèi)置變量;要么使用相對路徑,相對于pom.xml文件的路徑;
資源插件配置:
plugin配置?
上面的意思就是說把不同環(huán)境目錄下的配置文件拷貝到classes下,而不是classes下的XXX目錄下。
比如我們選擇profile為test打包,結(jié)果如下:
war包結(jié)構(gòu)?
文件內(nèi)容?
多模塊開發(fā):繼承與聚合
繼承?聚合?
繼承,在Java中就存在的概念,而且繼承和多態(tài)往往密不可分。對于Maven而言,我們可以將一個大的復(fù)雜的項目,進(jìn)行模塊劃分,這樣各個模塊各司其職,獨立開發(fā),這就涉及到繼承與聚合了。
演示一個小Demo:
工程結(jié)構(gòu)?
依賴關(guān)系父工程關(guān)鍵片段:
注意打包方式以及子模塊包含子工程關(guān)鍵片段:
子模塊pom.xml配置其實,上述demo把工程劃分為:
parent:root工程,沒有代碼,只有配置(比如進(jìn)行版本鎖定),用于聚合子模塊,在此工程上進(jìn)行mvn clean/package等,那么maven會自動根據(jù)依賴關(guān)系對每一個模塊進(jìn)行處理;
web模塊依賴service模塊,service模塊依賴dao模塊;
我們可以想象下:
dao模塊負(fù)責(zé)對DB的持久化操作,比如需要依賴mybatis,肯定也需要Spring來進(jìn)行bean管理以及Mapper代理,也即是依賴mybatis+spring,注意mybatis的mapper文件以及spring的配置文件都放入到resources下。
service模塊負(fù)責(zé)業(yè)務(wù)邏輯,需要依賴dao模塊。由于依賴dao自然就引入了spring依賴,這里只需要加入事務(wù)的相關(guān)配置。
web模塊負(fù)責(zé)前端交互,需要依賴service模塊,以及spring-mvc。
到這里,對于多模塊的繼承和聚合就有點了解了吧。
這里提一個問題:
在web模塊中,除了需要加載web模塊中的Spring配置文件外,顯然也需要加載service/dao模塊中的Spring配置文件,可是web模塊依賴service,service依賴dao,也就是說最終web模塊會依賴service.jar(spring配置文件在其中),dao.jar(spring配置文件在其中),因此我們需要加載service.jar、dao.jar中的spring配置文件!
留給你思考!^_^
?
私服
Nexus
私服,我們對其的印象,就如上圖所示。其實在日常中,我們對于私服的操作主要在于:
第一:可以搜索依賴坐標(biāo)得到XML片段;
第二:deploy 依賴到私服以及從私服下載依賴;
私服倉庫類型:
倉庫信息group:一個倉庫組,說白了,就是幾個倉庫的集合。
hosted:宿主倉庫,存儲公司內(nèi)部開發(fā)的jar,分為Releases/Snapshots。
proxy:用于代理中央倉庫。
到這里,你應(yīng)該能感覺到,在settings.xml/pom.xml中進(jìn)行私服配置的時候,我們勢必會配置宿主倉庫的信息,比如倉庫的ID、用戶名、密碼、訪問URL等。
?
have a good night!
作者:張豐哲
鏈接:https://www.jianshu.com/p/34740cd1fb58
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。
總結(jié)
以上是生活随笔為你收集整理的工程化专题之Maven(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工程化专题之Maven(上)
- 下一篇: 【手写系列】写一个迷你版的Tomcat