工程化專題之Maven(下)

前言

《工程化專題之Maven(上)》

本文是工程化專題之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:

工程結(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)然,我們也可以建立多個(gè)目錄,每一個(gè)目錄表示一個(gè)環(huán)境,那么選擇一套環(huán)境,就讓這個(gè)目錄下的資源文件生效。(比如xxx/config.xml)

Profile定義:

Profile

IDEA 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)行打包?

實(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配置

第一,我們通過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而言,我們可以將一個(gè)大的復(fù)雜的項(xiàng)目,進(jìn)行模塊劃分,這樣各個(gè)模塊各司其職,獨(dú)立開發(fā),這就涉及到繼承與聚合了。

演示一個(gè)小Demo:

工程結(jié)構(gòu)
依賴關(guān)系

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

注意打包方式以及子模塊包含

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

子模塊pom.xml配置

其實(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配置文件!

留給你思考!^_^

私服

Nexus

私服,我們對其的印象,就如上圖所示。其實(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!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容