1. 程式人生 > >工程化專題之Maven(下)

工程化專題之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等。

 

have a good night!


作者:張豐哲
連結:https://www.jianshu.com/p/34740cd1fb58
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。