工程化專題之Maven(下)

前言

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

本文是工程化專題之Maven的下篇,主要涵蓋的是Maven的Profile/Filter特性,多模塊開發以及私服等內容。


不同環境使用不同配置:Profile+Filter

在實際開發場景下,我們必然會存在多套環境:測試環境、開發環境、線上環境等。在不同環境下,我們就會有多套配置文件,比如數據源配置。

我們期望的是,不論部署到什么環境,不必修改代碼,不必修改配置。

很慶幸的是,Maven提供了一個方便的解決方案:Profile功能。

給大家演示個小demo:

工程結構

對于多套環境而言,我們可以抽取出相同的部分,放入到公共的文件當中,把那些跟著環境變化而變化的配置信息,分環境存放,最后根據選擇的環境而將那部分配置信息動態注入到公共的文件當中。(比如db.properties和filter/db-xxx.properties)

當然,我們也可以建立多個目錄,每一個目錄表示一個環境,那么選擇一套環境,就讓這個目錄下的資源文件生效。(比如xxx/config.xml)

Profile定義:

Profile

IDEA Maven插件:

選擇Profile

如pom.xml所示,通過profile定義了dev、release、test這3套環境。注意在<profile>中通過<properties>進行了自定義屬性。

Maven屬性的概念?

Maven有一套自己內置的屬性,比如${basedir},${project.xxx},Java相關,操作系統相關等,這些可以直接在pom.xml中進行引用;用戶也可以通過<properties>來自定義屬性,比如上面的例子,我們就可以在pom.xml中通過${profiles.active}來指明用戶選擇的profile。

注意,可以指定默認的profile。

選擇Profile進行打包?

實質上就是在執行mvn package -Pxxx而已。

我們來具體看一眼配置文件的內容信息:

配置文件信息

這里,我們需要重點注意的是:

在db.properties中,我們通過${jdbc.username}進行了引用,而jdbc.username是在db-xxx.properties中定義的。

說白了,現在,我們要讓db-xxx.properties中的KEY成為變量,并進行替換db.properties這個資源文件中的內容。

filter配置:

filter配置

第一,我們通過filter來指定變量配置文件的地址,要通過profile變量進行動態選擇;

第二,要知道默認Maven資源文件的打包,就是COPY一份資源文件到默認的輸出目錄,一般就是classes下,現在必須讓資源文件可以進行變量替換,因此開啟過濾功能

第三,在圖中配置,通過exclude排除了filter資源目錄下的文件,也就是最后打包里面沒有filter目錄下的文件;

第四:要么使用絕對路徑,那就要使用到Maven的內置變量;要么使用相對路徑,相對于pom.xml文件的路徑;

資源插件配置:

plugin配置

上面的意思就是說把不同環境目錄下的配置文件拷貝到classes下,而不是classes下的XXX目錄下。

比如我們選擇profile為test打包,結果如下:

war包結構


文件內容


多模塊開發:繼承與聚合

繼承?聚合?

繼承,在Java中就存在的概念,而且繼承和多態往往密不可分。對于Maven而言,我們可以將一個大的復雜的項目,進行模塊劃分,這樣各個模塊各司其職,獨立開發,這就涉及到繼承與聚合了。

演示一個小Demo:

工程結構
依賴關系

父工程關鍵片段:

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

子工程關鍵片段:

子模塊pom.xml配置

其實,上述demo把工程劃分為:

parent:root工程,沒有代碼,只有配置(比如進行版本鎖定),用于聚合子模塊,在此工程上進行mvn clean/package等,那么maven會自動根據依賴關系對每一個模塊進行處理;

web模塊依賴service模塊,service模塊依賴dao模塊;

我們可以想象下:

dao模塊負責對DB的持久化操作,比如需要依賴mybatis,肯定也需要Spring來進行bean管理以及Mapper代理,也即是依賴mybatis+spring,注意mybatis的mapper文件以及spring的配置文件都放入到resources下。

service模塊負責業務邏輯,需要依賴dao模塊。由于依賴dao自然就引入了spring依賴,這里只需要加入事務的相關配置。

web模塊負責前端交互,需要依賴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

私服,我們對其的印象,就如上圖所示。其實在日常中,我們對于私服的操作主要在于:

第一:可以搜索依賴坐標得到XML片段;

第二:deploy 依賴到私服以及從私服下載依賴;

私服倉庫類型:

倉庫信息

group:一個倉庫組,說白了,就是幾個倉庫的集合。

hosted:宿主倉庫,存儲公司內部開發的jar,分為Releases/Snapshots。

proxy:用于代理中央倉庫。

到這里,你應該能感覺到,在settings.xml/pom.xml中進行私服配置的時候,我們勢必會配置宿主倉庫的信息,比如倉庫的ID、用戶名、密碼、訪問URL等。


現在是2017-08-30 22點,工程化專題之Maven就要結束了!

have a good night!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容