国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Maven(5)-優化和重構POM

2019-11-14 15:20:38
字體:
來源:轉載
供稿:網友

 本文主要介紹如何優化pom,杜絕重復(DRY)。

    1)模塊重復依賴;

    2)坐標版本號重復;

    3)兄弟依賴

 

一、項目骨架

上圖說明:

  1. multi-module-PRoject是一個有多個模塊構成的項目,模塊分別為:web-service、web-app、web-dal
  2. web-service、web-app、web-dal分別依賴與log4j
  3. web-app同時依賴web-service和web-dal,因為這三個模塊屬于同一個project,所以這種依賴叫做兄弟依賴。

 二、模塊重復依賴

2.1 問題

由于三個模塊同時依賴與log4j組件,如果在web-service,web-app,以及web-dal的pom文件中分別都加入對log4j的依賴(首先,這是可以的)就會出現一個問題:當log4j有新的版本出現,且自己的項目想引入這個新版本,由于每個模塊都配置了對log4j的依賴,那么就需要在每個模塊的pom文件中進行修改,工作量很大,且如果模塊多,類似的重復依賴也多,就容易出現有些模塊漏修改的問題,容易產生問題。

該問題就猶如有很多重復代碼大量存在于不同的模塊,當有針對這塊重復代碼邏輯修改的時候,就需要大量的人力去到處修改,且容易出錯。怎么辦?代碼中的問題可以通過把這個重復代碼單獨封裝,然后多出進行調用。這樣有需求變動時只需要修改一個地方即可。

2.2 解決方案

maven的pom文件優化類似,maven中可以將這些子模塊中相同的依賴移到父模塊的dependencyManagement節點。

最佳實踐:如果有兩個以上的子模塊共同依賴一個組件,那么對于這個組建的依賴就應該放在父模塊的dependencyManagement節點

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>>4.0.0</modelVersion>    <groupId>com.VEVb.kmpp</groupId>    <artifactId>multi-module</artifactId>    <packaging>pom</packaging>    <version>1.0-SNAPSHOT</version>    <modules>        <module>web-app</module>        <module>web-service</module>        <module>web-dal</module>    </modules><dependencyManagement>    <dependencies>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.12</version>        </dependency>    </dependencies></dependencyManagement></project>

 當然如果將依賴移到父模塊的dependencyManagement模塊后,需要在子模塊中將對應的依賴刪除,否則,子模塊的配置會覆蓋父模塊的配置。

三、版本號重復

3.1 問題演示

 <dependencies>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.12</version>        </dependency>        <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate-annotations</artifactId>            <version>3.3.0.ga</version>        </dependency>        <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate-commons-annotations</artifactId>            <version>3.3.0.ga</version>        </dependency>        <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate</artifactId>             <version>3.2.5.ga</version>        </dependency>    </dependencies>

 上面的pom配置中作為org.hibernate下面的組件,版本號重復了,一般來說,一個組織(groupid)下面的組件的版本號是一致的,且一起更新,和上面說的多個模塊重復依賴一個組件類型,當同一個版本號多處出現時,如果修改,就會出現工作量大且有漏修改的風險。

3.2 解決

使用屬性元素(property),統一定義版本號,多處進行使用:

<properties>    <hibernate.annotations.version>3.3.0.ga</hibernate.annotations.version></properties><dependencyManagement>    <dependencies>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.12</version>        </dependency>        <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate-annotations</artifactId>            <version>${hibernate.annotations.version}</version>        </dependency>        <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate-commons-annotations</artifactId>            <version>${hibernate.annotations.version}</version>        </dependency>        <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate</artifactId>            <version>${hibernate.annotations.version}</version>        </dependency>    </dependencies></dependencyManagement>

 

這樣當org.hibernate的版本號變化的時候只需要修改以地方。其實版本號類似于程序里面的magic number。不管是不是多次使用,最好都通過定義property來實現,上面的junit的版本號也應該預先在property中進行定義,然后再使用。

四、兄弟依賴

4.1 問題

web-app依賴web-dal和web-service組件

        <dependency>            <groupId>com.VEVb.kmpp</groupId>            <artifactId>web-service</artifactId>            <version>1.0-SNAPSHOT</version>        </dependency>        <dependency>            <groupId>com.VEVb.kmpp</groupId>            <artifactId>web-dal</artifactId>            <version>1.0-SNAPSHOT</version>        </dependency>

 上面的依賴同樣有重復:groupId和version。

4.2 解決

因為web-app、web-dal以及web-service作為兄弟模塊他們的groupId和version是和父模塊是一樣的。所以兄弟依賴的groupId和version可以使用父模塊的數據:

   <dependency>            <groupId>${parent.groupId}</groupId>            <artifactId>web-service</artifactId>            <version>${parent.version}</version>        </dependency>        <dependency>            <groupId>${parent.groupId}</groupId>            <artifactId>web-dal</artifactId>            <version>${parent.version}</version>        </dependency>

 當然,兄弟依賴的重復也可以通過property來定義解決,但是沒有直接使用父模塊屬性方便。

五、maven 依賴分析

maven已經提供了命令:

  1. mvn dependency:analyze,使用該命令就可以看到maven分析的結果和建議
  2. mvn dependency:tree,使用該命令可以看到maven的依賴樹。

六、結束語

DRY works everywhere and always will do.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 雷波县| 建昌县| 昌平区| 壶关县| 南京市| 额尔古纳市| 民和| 惠州市| 临沂市| 石阡县| 特克斯县| 宿松县| 金坛市| 凤翔县| 普兰县| 遵化市| 罗城| 平塘县| 安化县| 宝清县| 体育| 汕尾市| 泉州市| 湾仔区| 耒阳市| 盐山县| 巨野县| 申扎县| 绥滨县| 莲花县| 枝江市| 昭通市| 屏东市| 蒙城县| 建宁县| 酒泉市| 尉氏县| 雅安市| 芦溪县| 溆浦县| 永靖县|