(一)解耦java
使用maven,在沒有任何實際的Java代碼,咱們就能夠定義一個maven項目的pom,這個就是maven的一大優勢,能讓項目對象模型最大程度的和實際的代碼相互獨立,這個就叫作解耦,或者正交性。spring
當項目須要升級版本的時候,只須要修改pom,而不須要更改Java代碼,在pom穩定以後,平常的Java代碼開發公國基本不涉及pom的修改。apache
(二)依賴範圍maven
在pom.xml的配置中,
例如在pom.xml中的junit的座標以下測試
<deprdency> <groupId>junit</groupId> <artifactId>junit</artificatId> <version>4.7</version> <scope>test</scope> </dependency>
scope爲依賴範圍,在此處依賴範圍是test,表明改以來只對測試有效。ui
換句話說,在測試代碼中使用import Junit沒有問題,可是在主代碼中使用import Junit,則會形成編譯錯誤,若是不聲明依賴範圍,那麼默認值就是compile,表示改以來對主代碼和測試代碼都有效。url
(三)maven的compile插件支持的Java版本插件
因爲歷史的緣由,maven的核心插件之一---compiler插件默認只支持變異Java1.3,所以須要配置該插件使其支持Java的別的版本。
代碼以下:版本控制
<project> ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> </project>
這樣配置後,該compiler插件支持Java1.5版本code
聚合
爲了可以使用一條命令就能構建 account-email和 account-persist兩個模塊,咱們須要創建一個額外的名爲 account-aggregator的模塊,而後經過該模塊構建整個項目的全部模塊。 account-aggregator自己也是個 Maven項目,它的 POM以下
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.juvenxu.mvnbook.account</groupId> <artifactId>account-aggregator</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging> pom </packaging> <name>Account Aggregator</name> <modules> <module>account-email</module> <module>account-persist</module> </modules> </project>
注意:packaging的類型爲pom ,module的值是一個以當前POM爲主目錄的相對路徑。
繼承
可聲明父POM供子POM繼承
父模塊POM以下:
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.juvenxu.mvnbook.account</groupId> <artifactId> account-parent </artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>Account Parent</name> </project>
子模塊聲明繼承以下
<project> <modelVersion>4.0.0</modelVersion> < parent > <groupId>com.juvenxu.mvnbook.account</groupId> <artifactId> account-parent </artifactId> <version>1.0.0-SNAPSHOT</version> < relativePath >../account-parent/pom.xml</ relativePath> </ parent > <artifactId> account-email </artifactId> <name>Account Email</name> ... </project>
最後,一樣還須要把 account-parent加入到聚合模塊account-aggregator中。聚合的 POM以下:
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.juvenxu.mvnbook.account</groupId> <artifactId>account-aggregator</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging> pom </packaging> <name>Account Aggregator</name> <modules> <module>account-email</module> <module>account-persist</module> <module> account-parent</module> </modules> </project>
注意:
一、子模塊沒有聲明groupId和version, 這兩個屬性繼承至父模塊。但若是子模塊有不一樣與父模塊的 groupId、version ,也可指定;
二、不該該繼承artifactId,若是groupId ,version,artifactId 徹底繼承的話會形成座標衝突;另外即便使用不一樣的 groupId或version,一樣的 artifactId也容易產生混淆。
三、使用繼承後 parent也必須像自模塊同樣加入到聚合模塊中。也就是在在聚合模塊的 pom中加入
(四)聚合與繼承的關係
區別 :
1.對於聚合模塊來講,它知道有哪些被聚合的模塊,但那些被聚合的模塊不知道這個聚合模塊的存在。
2.對於繼承關係的父 POM來講,它不知道有哪些子模塊繼承與它,但那些子模塊都必須知道本身的父 POM是什麼。
共同點 :
1.聚合 POM與繼承關係中的父POM的 packaging都是pom
2.聚合模塊與繼承關係中的父模塊除了 POM以外都沒有實際的內容。
(五)maven可繼承pom元素
groupId :項目組 ID ,項目座標的核心元素; version :項目版本,項目座標的核心元素; description :項目的描述信息; organization :項目的組織信息; inceptionYear :項目的創始年份; url :項目的 url 地址 develoers :項目的開發者信息; contributors :項目的貢獻者信息; distributionManagerment :項目的部署信息; issueManagement :缺陷跟蹤系統信息; ciManagement :項目的持續繼承信息; scm :項目的版本控制信息; mailingListserv :項目的郵件列表信息; properties :自定義的 Maven 屬性; dependencies :項目的依賴配置; dependencyManagement :醒目的依賴管理配置; repositories :項目的倉庫配置; build :包括項目的源碼目錄配置、輸出目錄配置、插件配置、插件管理配置等; reporting :包括項目的報告輸出目錄配置、報告插件配置等。
(六)依賴管理---dependencyManagement
看上面的maven可繼承pom元素中有dependencies元素,說明依賴會被繼承的。
想到通常多個子模塊會痛是依賴springframework中的架包,那麼能夠將這些依賴加入到父模塊中,這樣子模塊就能夠一處相應的依賴,簡化配置。
可是這個有一個問題,就是不能肯定未來添加的子模塊就必定須要這幾個依賴,加入未來又要添加一個子模塊,可是須要別的架包,那麼根本就不須要依賴springframework的架包
可使用dependencyManagement來讓子模塊繼承到父模塊的依賴配置,又能保證子模塊依賴使用的靈活性。
父模塊代碼以下:
<project xmlnsxmlns="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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.juvenxu.mvnbook.account</groupId> <artifactId>account-parent</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>Account Parent</name> <properties> <springframework.version>2.5.6<springframework.version> <junit.version>4.7</junit.version> </properties> < dependencyManagement > <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </ dependencyManagement > </project>
<properties> <springframework.version>2.5.6<springframework.version> <junit.version>4.7</junit.version> </properties>
子模塊pom代碼以下
<project xmlnsxmlns="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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> < parent > <groupId>com.juvenxu.mvnbook.account</groupId> <artifactId> account-parent </artifactId> <version>1.0.0-SNAPSHOT</version> </ parent > <artifactId>account-email</artifactId> <name>Account Email</name> <properties> <javax.mail.version>1.4.1</javax.mail.version> <greenmail.version>1.3.1b</greenmail.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>${javax.mail.version}</version> </dependency> <dependency> <groupId>com.icegreen</groupId> <artifactId>greenmail</artifactId> <version>${greenmail.version}</version> <scope>test</scope> </dependency> </dependencies> <build> </build> </project>
注意子模塊的寫法,須要只有本身這個模塊須要的架包,就在相應的架包依賴中寫version,不然不須要寫,共有的架包的依賴已經在父模板中已經寫好,只須要繼承父模板便可,茲莫辦只須要配置相應的groupId和actifactId就能夠得到相應的以來信息,從而引入正確的依賴;
1.代碼量減小,不用屢次重複聲明version等元素
2.version在父模塊中管理,父變則子變,便於修改,也便於版本的統一,不會發生不一樣的子模板使用的依賴的版本不一致的狀況,下降衝突的概率。
3.dependencyManagement一旦定義,能夠複用