本文主要介紹如何優化pom,杜絕重復(DRY)。
1)模塊重復依賴;
2)坐標版本號重復;
3)兄弟依賴
一、項目骨架
上圖說明:
由于三個模塊同時依賴與log4j組件,如果在web-service,web-app,以及web-dal的pom文件中分別都加入對log4j的依賴(首先,這是可以的)就會出現一個問題:當log4j有新的版本出現,且自己的項目想引入這個新版本,由于每個模塊都配置了對log4j的依賴,那么就需要在每個模塊的pom文件中進行修改,工作量很大,且如果模塊多,類似的重復依賴也多,就容易出現有些模塊漏修改的問題,容易產生問題。
該問題就猶如有很多重復代碼大量存在于不同的模塊,當有針對這塊重復代碼邏輯修改的時候,就需要大量的人力去到處修改,且容易出錯。怎么辦?代碼中的問題可以通過把這個重復代碼單獨封裝,然后多出進行調用。這樣有需求變動時只需要修改一個地方即可。
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模塊后,需要在子模塊中將對應的依賴刪除,否則,子模塊的配置會覆蓋父模塊的配置。
<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)下面的組件的版本號是一致的,且一起更新,和上面說的多個模塊重復依賴一個組件類型,當同一個版本號多處出現時,如果修改,就會出現工作量大且有漏修改的風險。
使用屬性元素(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中進行定義,然后再使用。
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。
因為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已經提供了命令:
DRY works everywhere and always will do.
新聞熱點
疑難解答