《maven in action》部分知識點總結

maven in action 的部分知識點總結

今天又將《maven in action》這本書看了一遍,總結了一下,大概須要的知識點

(一)解耦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中加入 account-parent

(四)聚合與繼承的關係

區別 :
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>

注意這裏的父模塊的pom代碼,這裏將用到的架包的的版本已maven參數的形式提取了出來,不只消除了一些重複,也使得各以來的版本處於更明顯的位置

<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一旦定義,能夠複用

相關文章
相關標籤/搜索