前言
本文是工程化專題之Maven的下篇,主要涵蓋的是Maven的Profile/Filter特性,多模塊開發(fā)以及私服等內(nèi)容。
不同環(huán)境使用不同配置:Profile+Filter
在實(shí)際開發(fā)場景下,我們必然會存在多套環(huán)境:測試環(huán)境、開發(fā)環(huán)境、線上環(huán)境等。在不同環(huán)境下,我們就會有多套配置文件,比如數(shù)據(jù)源配置。
我們期望的是,不論部署到什么環(huán)境,不必修改代碼,不必修改配置。
很慶幸的是,Maven提供了一個(gè)方便的解決方案:Profile功能。
給大家演示個(gè)小demo:

對于多套環(huán)境而言,我們可以抽取出相同的部分,放入到公共的文件當(dāng)中,把那些跟著環(huán)境變化而變化的配置信息,分環(huán)境存放,最后根據(jù)選擇的環(huán)境而將那部分配置信息動態(tài)注入到公共的文件當(dāng)中。(比如db.properties和filter/db-xxx.properties)
當(dāng)然,我們也可以建立多個(gè)目錄,每一個(gè)目錄表示一個(gè)環(huán)境,那么選擇一套環(huán)境,就讓這個(gè)目錄下的資源文件生效。(比如xxx/config.xml)
Profile定義:

IDEA Maven插件:

如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)行打包?
實(shí)質(zhì)上就是在執(zhí)行mvn package -Pxxx而已。
我們來具體看一眼配置文件的內(nèi)容信息:

這里,我們需要重點(diǎn)注意的是:
在db.properties中,我們通過${jdbc.username}進(jìn)行了引用,而jdbc.username是在db-xxx.properties中定義的。
說白了,現(xiàn)在,我們要讓db-xxx.properties中的KEY成為變量,并進(jìn)行替換db.properties這個(gè)資源文件中的內(nèi)容。
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文件的路徑;
資源插件配置:

上面的意思就是說把不同環(huán)境目錄下的配置文件拷貝到classes下,而不是classes下的XXX目錄下。
比如我們選擇profile為test打包,結(jié)果如下:


多模塊開發(fā):繼承與聚合
繼承?聚合?
繼承,在Java中就存在的概念,而且繼承和多態(tài)往往密不可分。對于Maven而言,我們可以將一個(gè)大的復(fù)雜的項(xiàng)目,進(jìn)行模塊劃分,這樣各個(gè)模塊各司其職,獨(dú)立開發(fā),這就涉及到繼承與聚合了。
演示一個(gè)小Demo:


父工程關(guān)鍵片段:

子工程關(guān)鍵片段:

其實(shí),上述demo把工程劃分為:
parent:root工程,沒有代碼,只有配置(比如進(jìn)行版本鎖定),用于聚合子模塊,在此工程上進(jìn)行mvn clean/package等,那么maven會自動根據(jù)依賴關(guān)系對每一個(gè)模塊進(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。
到這里,對于多模塊的繼承和聚合就有點(diǎn)了解了吧。
這里提一個(gè)問題:
在web模塊中,除了需要加載web模塊中的Spring配置文件外,顯然也需要加載service/dao模塊中的Spring配置文件,可是web模塊依賴service,service依賴dao,也就是說最終web模塊會依賴service.jar(spring配置文件在其中),dao.jar(spring配置文件在其中),因此我們需要加載service.jar、dao.jar中的spring配置文件!
留給你思考!^_^
私服

私服,我們對其的印象,就如上圖所示。其實(shí)在日常中,我們對于私服的操作主要在于:
第一:可以搜索依賴坐標(biāo)得到XML片段;
第二:deploy 依賴到私服以及從私服下載依賴;
私服倉庫類型:

group:一個(gè)倉庫組,說白了,就是幾個(gè)倉庫的集合。
hosted:宿主倉庫,存儲公司內(nèi)部開發(fā)的jar,分為Releases/Snapshots。
proxy:用于代理中央倉庫。
到這里,你應(yīng)該能感覺到,在settings.xml/pom.xml中進(jìn)行私服配置的時(shí)候,我們勢必會配置宿主倉庫的信息,比如倉庫的ID、用戶名、密碼、訪問URL等。
現(xiàn)在是2017-08-30 22點(diǎn),工程化專題之Maven就要結(jié)束了!
have a good night!