實戰 | 使用maven 輕鬆重構專案
user-system拆分成:
user-web
user-service
user-dao
user-common
我們對其拆分後很有可能存在多個子專案中同時依賴某個jar包,如果使用不當可能會導致每個模組使用的版本不一樣,所以想想能不能有什麼方式來解決這類問題呢?
答案:能。但是得先了解兩個概念:聚合和繼承。
聚合
所謂的聚合就是我們如果想一次性構建多個專案模組,那我們就需要把這些專案模組進行聚合。
配置模板
<modules> <module>專案模組一</module> <module>專案模組二</module> <module>專案模組三</module> <module>專案模組...</module></modules>
使用方式
比如我們對user-web、user-service、user-dao、user-common四個專案模組進行聚合。
<modules> <module>user-web</module> <module>user-service</module> <module>user-dao</module> <module>user-common</module></modules>
注意:其中module的路徑為相對路徑。
這樣就解決了我們專案模組的聚合,我們再來看看maven是如何來解決由於重複依賴導致版本不一樣的問題。
繼承
繼承為了消除重複,我們把很多相同的配置提取出來,例如:grouptId,version等 。
繼承的配置
<parent> <artifactId>maven-demo</artifactId> <groupId>com.tian</groupId> <version>1.0-SNAPSHOT</version></parent>
繼承程式碼中定義屬性
繼承程式碼過程中,可以定義屬性,例如:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>4.13.1</junit.version> <maven.version>0.0.1-SNAPSHOT</maven.version></properties>
訪問屬性的方式為${junit.version},例如:
<?xml version="1.0" encoding="UTF-8"?><project xmlns=" xmlns:xsi=" xsi:schemaLocation=" <parent> <artifactId>maven-demo</artifactId> <groupId>com.tian</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>user-web</artifactId> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <!-- 使用了parent中 junit.version --> <version>${junit.version}</version> </dependency> </dependencies></project>
這樣我們就可以使用到上面定義的屬性junit.version=4.13.1。
父模組用dependencyManagement進行管理
由於專案模組較多,所以我們又抽象了一層,抽出一個parent來管理子專案的公共的依賴。為了專案的正確執行,必須讓所有的子專案使用依賴項的統一版本,必須確保應用的各個專案的依賴項和版本一致,才能保證測試的和釋出的是相同的結果。
<dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies></dependencyManagement>
這樣的好處是子模組可以有選擇性的繼承,而不需要全部繼承。
這樣做的好處:統一管理專案的版本號,確保應用的各個專案的依賴和版本一致,才能保證測試的和釋出的是相同的成果,因此,在頂層pom中定義共同的依賴關係。同時可以避免在每個使用的子專案中都宣告一個版本號,這樣想升級或者切換到另一個版本時,只需要在父類容器裡更新,不需要任何一個子專案的修改;如果某個子專案需要另外一個版本號時,只需要在dependencies中宣告一個版本號即可。子類就會使用子類宣告的版本號,不繼承於父類版本號。
聚合和繼承的關係
在前面我們構建多模組專案中,關係如下mavendemo就是user-web、user-service等幾個模組的父專案。
父專案主要是用來配置一些公共的配置,其它三個專案再透過繼承的方式擁有父專案中的配置,首先配置父專案的pom.xml,新增對專案的user-web、user-service、user-dao、user-common這四個模組進行聚合以及jar包依賴。
相對於dependencyManagement,所有生命在dependencies裡的依賴都會自動引入,並預設被所有的子專案繼承。
面試題:dependencyManagement和dependencies的區別
dependencyManagement裡只是宣告依賴,並不實現引入,因此子專案需要顯示的宣告需要用的依賴。如果不在子專案中宣告依賴,是不會從父專案中繼承下來的;只有在子專案中寫了該依賴項,並且沒有指定具體版本,才 會從父專案中繼承該項,並且version和scope都讀取自父pom;另外如果子專案中指定了版本號,那麼會使用子專案中指定的jar版本。
dependencies即使在子專案中不寫該依賴項,那麼子專案仍然會從父專案中繼承該依賴項(全部繼承)。
IDEA中配置Maven
在使用IDEA開發時,如何將Maven配置呢?
開啟IDEA,在File--->Settings。輸入欄搜尋:maven置我們之前安裝好的maven目錄、maven下面的setting.xml以及本地倉庫目錄。然後Apply--->OK。
我們專案對某個專案進行clean 等操作的時候,就可以直接雙擊Lifcycle下面的。
這樣我們就把Maven整合到我們的IDEA中來了。
編譯執行專案
我們可以在父專案中對所有子專案進行編譯、打包等。我們就來對所有子模組進行打包。
然後在對應子專案中可以找到target目錄和對應的jar包。
也可單獨對某個子專案進行打包等操作。比如我們對user-common進行clean。於是,此時的user-common下的target已經被刪掉,其他子專案中並沒有收到影響。
IDEA中如何建立多專案模組
先建立一個user-parent的maven專案:
然後把src目錄刪掉,建立子專案:
來到New Module介面,選擇Maven,選好自己的本地安裝的JDK。next。填寫子專案名稱,我們這裡建立一個user-web的子專案:注意這裡user-web,預設是userweb,需要我們手工在兩個單詞之間新增橫線:
點選Finish:然後在看看user-parent的pom中的內容:
已經新增了modules,同時把我們的user-web新增進去了。
同樣方法,我們就可以建立更多字專案了:
再看看user-parent中的pom.xml檔案內容:到這裡,我們就輕輕鬆鬆的構建了我們這個大專案user-parent,該專案包括了user-web,user-service,user-dao,-user-commmon子專案。
若是新建多模組專案,安裝上面的步驟就搞定了。
若是大專案拆分,我們就可以使用上面的方式先建立好自己的多模組專案,然後對應把大專案裡的內容複製到對應模組中(需要注意此時子模組直接肯定會有相互依賴的)。
總結
透過繼承,我們可以定義專案的父類專案,用於繼承父專案的依賴、外掛、屬性等資訊。聚合就是我們如果想一次性構建多個專案模組,那我們就需要對這些專案模組進行聚合。
構建多模組專案,在IDEA中使用建立Module的方式很輕鬆就可以建立了。在父專案中使用來管理子模組的依賴相關依賴。
對大專案進行重構時,只需要把各模組拆分出來的程式碼複製到對應子模組就可以了。
「沒有天生的信心,只有不斷培養的信心。」
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990085/viewspace-2753939/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- kubernetes下jenkins實戰maven專案編譯構建JenkinsMaven編譯
- 使用Maven構建Java專案MavenJava
- 【Maven實戰技巧】「外掛使用專題」Maven-Archetype外掛建立自定義maven專案骨架Maven
- 【RAG 專案實戰 05】重構:封裝程式碼封裝
- 首次使用ideal構建maven專案webIdeaMavenWeb
- Maven 構建 Java 專案MavenJava
- webpack專案輕鬆混用css moduleWebCSS
- 提升專案管理效率,輕鬆應對挑戰——OmniPlan Pro 4 for Mac專案管理Mac
- 實戰(二)輕鬆使用requests庫和beautifulsoup爬連結
- 輕鬆搞定專案流程自動化
- 使用Eclipse 安裝 構建Maven專案 (step-by-step)EclipseMaven
- 專案管理基本流程介紹,讓你輕鬆管理專案專案管理
- maven 專案轉化成 gradle 專案實踐MavenGradle
- Gradle實戰及Maven專案遷移採坑記錄GradleMaven
- 【Maven實戰技巧】「外掛使用專題」Maven-Assembly外掛實現自定義打包Maven
- 一行程式碼讓你的專案輕鬆使用Dapr行程
- 在 Maven 專案中使用 HanLPMavenHanLP
- 如何在 Laravel 專案中輕鬆實現上傳頭像功能?Laravel
- 專案實戰之元件化架構元件化架構
- 專案實戰之gradle在實際專案中的使用Gradle
- SpringBoot實戰:輕鬆實現介面資料脫敏Spring Boot
- 使用 Zephir 輕鬆構建 PHP 擴充套件PHP套件
- Jenkins 2.32.3引數化構建maven專案-java專案JenkinsMavenJava
- 輕鬆搞定專案管理軟體、分配任務專案管理
- 使用騰訊tslint-config-alloy輕鬆搞定ionic專案中TSLint配置
- 你竟然沒用 Maven 構建專案?Maven
- Maven實戰與原理分析(二):maven實戰Maven
- 專案實戰之Rxjava、RxBinding在實際專案中的使用RxJava
- 老舊系統重構技巧,輕鬆搞定遺留程式碼
- Python實戰案例彙總,帶你輕鬆從入門到實戰Python
- 專案管理新手?這3點讓你輕鬆把控專案進度專案管理
- 輕鬆讓別人訪問到自己本地專案
- [譯] 輕鬆管理 Swift 專案中的不同環境Swift
- Maven配置阿里雲代理加速構建專案Maven阿里
- 使用 AppImageLauncher 輕鬆執行和整合 AppImage 檔案APP
- 把 Maven 提交到專案?Maven Wrapper的使用與好處MavenAPP
- 【版本2020.03】使用idea匯入maven專案IdeaMaven
- 如何輕鬆歸檔檔案?2種方法輕鬆建立歸檔檔案!