Maven百科 - 項目構建中的聚合與繼承

摘要    

   繼承和聚合看似都是在主要的POM文件中作一下相應的配置,在實際操做過程當中每每只是知其然不知其因此然,不知道的可能很容易混淆。spring

 

1 繼承

    

    繼承就是在從主pom那裏繼承許多重用的配置,能夠省去許多代碼量了。api

使用繼承方式的話,須要一個主POM,其packaging定義爲pom。它自己能夠不參與構建maven

<groupId>com.sd</groupId>
 <artifactId>sd.excel</artifactId>
 <packaging>pom</packaging>
 <version>1.0-SNAPSHOT</version>

    此外還須要在子模塊中 定義父模塊的相關信息。 ui

<parent>
        <artifactId>sd.excel</artifactId>
        <groupId>com.sd</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>sd.excel.base</artifactId>
    <name>sd.excel.base</name>

    在parent元素中聲明的是父pom的GAV和父POM的相對路勁。 而後再聲明本身的GAV。 上圖的group和version省略了,緣由是從主POM那裏繼承了。url

   除了groupId和Version 還有哪些元素能夠被繼承的呢?spa

 1.1 可繼承的POM元素

groupId

項目Id插件

version 項目版本
description 項目描述
organization 項目組織信息
inceptionYear 項目創始年份
url 項目url地址
developers 項目開發者
contributors 項目貢獻者
distributionManagement 項目部署配置
issueManagement 項目缺陷跟蹤系統信息
ciManagement 項目的持續集成系統信息
scm 項目的版本控制系統信息
mailingList 項目的郵件列表信息
properties 自定義的maven屬性
dependencies 項目的依賴配置
dependenciesManagement 項目的依賴配置管理
repositories 項目倉庫配置
build 項目的構建配置,包括源碼,輸出目錄,插件配置等
reporting 報告配置

 

 

2. 聚合

    所謂聚合,其實就是多模塊構建。面對較爲複雜的項目,一般都會被分爲不少相互依賴的模塊,而這些模塊是獨立構建,maven爲了應付這種相似的需求,設置了聚合方式。版本控制

    使用聚合方式,須要組建一個主模塊或者說聚合模塊,它是用來管理組織那些小模塊。這個聚合模塊自己是不用構建的,excel

它只須要定義一個看似較爲特殊的POM便可。code

    咱們以模塊 account-email和account-persist爲例,咱們爲此組建了一個名爲account-aggregator的聚合模塊。聚合模塊的POM長這樣:

    

<modelVersion>4.0.0</modelVersion>

    <groupId>com.sd</groupId>
    <artifactId>sd.excel</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>sd-excel-api</module>
        <module>sd-excel-base</module>
    </modules>

    其中須要注意的地方是packaing 被定義爲POM,其次它額外聲明瞭 modules 在這裏面 添加了各個module的名字。

固然了,這只是創建在 主POM文件和 各模塊是父子層級關係的時候,固然也能夠是平行關係。見下圖

    左圖是父子關係的層級圖,右圖是平行關係的層級圖。若是說只用層級關係的時候主POM中的module須要作相應的變化、

    還有一點須要注意的是,各個被聚合模塊不知道其餘聚合模塊的存在,若是模塊之間有依賴關係,須要在本身的POM文件聲明GAV。

    好在MAVEN會根據依賴關係,決定編譯打包順序。

3 DependencyManagement

    DependencyManagement 內部聲名的依賴包 自己不會被項目引入, 若是項目使用的依賴包(包括隱形依賴,引入的一些包) 會優先從DependencyManagement裏面查詢對應的版本號,若是沒有則使用默認傳遞依賴的版本號。 用來解決maven衝突是個很好的辦法

如:在dependencyManagement 中定義了junit的版本和scope

<dependencyManagement>
     <dependencies>
            <!-- Testing -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.10</version>
                <scope>test</scope>
            </dependency>

        </dependencies>
    </dependencyManagement>

那麼在其餘地方,在使用junit的時候能夠不用定義 version和scope, 另外對於一些傳遞依賴導進來的junit 也會使用dependencyManagement中定義的版本和scope。

<dependencies>
            <!-- Testing -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </dependency>
              

              <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.3.8.RELEASE</version>
       </dependency>

        </dependencies>
相關文章
相關標籤/搜索