Maven 依賴關係

項目的依賴關係主要分爲三種:依賴繼承聚合web

依賴關係

依賴關係是最經常使用的一種,就是你的項目須要依賴其餘項目,好比Apache-common包,Spring包等等。spring

<dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.11</version>
       <scope>test</scope>
       <type >jar</ type >
       <optional >true</ optional >
 </dependency>
複製代碼

任意一個外部依賴說明包含以下幾個要素:groupId, artifactId, version, scope, type, optional。其中前3個是必須的。 這裏的version能夠用區間表達式來表示,好比(2.0,)表示>2.0,[2.0,3.0)表示2.0<=ver<3.0;多個條件之間用逗號分隔,好比[1,3],[5,7]。 type 通常在pom引用依賴時候出現,其餘時候不用。api

maven認爲,程序對外部的依賴會隨着程序的所處階段和應用場景而變化,因此maven中的依賴關係有做用域(scope)的限制。在maven中,scope包含以下的取值:安全

Scope選項 描述
compile(編譯範圍) compile是默認的範圍;若是沒有提供一個範圍,那該依賴的範圍就是編譯範圍。編譯範圍依賴在全部的classpath中可用,同時它們也會被打包。
provided(已提供範圍) provided依賴只有在當JDK或者一個容器已提供該依賴以後才使用。例如,若是你開發了一個web應用,你可能在編譯classpath中須要可用 的Servlet API來編譯一個servlet,可是你不會想要在打包好的WAR中包含這個Servlet API;這個Servlet API JAR由你的應用服務器或者servlet容器提供。已提供範圍的依賴在編譯classpath(不是運行時)可用。它們不是傳遞性的,也不會被打包。
runtime(運行時範圍) runtime依賴在運行和測試系統的時候須要,但在編譯的時候不須要。好比,你可能在編譯的時候只須要JDBC API JAR,而只有在運行的時候才須要JDBC驅動實現
test(測試範圍) test範圍依賴在編譯和運行時都不須要,它們只有在測試編譯和測試運行階段可用。
system(系統範圍) system範圍依賴與provided相似,可是你必須顯式的提供一個對於本地系統中JAR文件的路徑。這麼作是爲了容許基於本地對象編譯,而這些對象是系統類庫的一部分。這樣的構件應該是一直可用的,Maven也不會在倉庫中去尋找它。 若是你將一個依賴範圍設置成系統範圍,你必須同時提供一個systemPath元素 。注意該範圍是不推薦使用的(應該一直儘可能去從公共或定製的Maven倉庫中引用依賴)。

dependency中的type通常不用配置,默認是jar。當type爲pom時,表明引用關係: 此時,本項目會將persistence-deps的全部jar包導入依賴庫。bash

能夠建立一個打包方式爲pom項目來將某些通用的依賴歸在一塊兒,供其餘項目直接引用,不要忘了指定依賴類型爲pom(pom)。服務器

繼承關係

繼承就是避免重複,maven的繼承也是這樣,它還有一個好處就是讓項目更加安全。項目之間存在上下級關係時就屬於繼承關係。架構

父項目的配置以下:maven

<project>  
	  <modelVersion>4.0.0</modelVersion>  
	  <groupId>org.clf.parent</groupId>  
	  <artifactId>my-parent</artifactId>  
	  <version>2.0</version>  
	  <packaging>pom</packaging> 
	  
	  <!-- 該節點下的依賴會被子項目自動所有繼承 -->
	  <dependencies>
  	    <dependency>
               <groupId>org.slf4j</groupId>
               <artifactId>slf4j-api</artifactId>
               <version>1.7.7</version>
               <type>jar</type>
               <scope>compile</scope>
        </dependency>
	  </dependencies>
	  
	  <dependencyManagement>
        <!-- 該節點下的依賴關係只是爲了統一版本號,不會被子項目自動繼承,-->
        <!--除非子項目主動引用,好處是子項目能夠不用寫版本號 -->
        <dependencies>
           <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-orm</artifactId>
                <version>4.2.5.RELEASE</version>
            </dependency>
 
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>4.2.5.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>4.2.5.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>4.2.5.RELEASE</version>
            </dependency>
        </dependencies>
       </dependencyManagement>
 
       <!-- 這個元素和dependencyManagement相相似,它是用來進行插件管理的-->
       <pluginManagement>  
       ......
       </pluginManagement>
</project>
複製代碼

注意,此時<packaging>必須爲pomide

爲了項目的正確運行,必須讓全部的子項目使用依賴項的統一版本,必須確保應用的各個項目的依賴項和版本一致,才能保證測試的和發佈是相同的結果。測試

Maven 使用dependencyManagement 元素來提供了一種管理依賴版本號的方式。一般會在一個組織或者項目的最頂層的父POM 中看到dependencyManagement 元素。使用pom.xml 中的dependencyManagement 元素能讓全部在子項目中引用一個依賴而不用顯式的列出版本號。Maven 會沿着父子層次向上走,直到找到一個擁有dependencyManagement元素的項目,而後它就會使用在這個dependencyManagement 元素中指定的版本號。

父項目在dependencies聲明的依賴,子項目會從所有自動地繼承。而父項目在dependencyManagement裏只是聲明依賴,並不實現引入,所以子項目須要顯示的聲明須要用的依賴。若是不在子項目中聲明依賴,是不會從父項目中繼承下來的;只有在子項目中寫了該依賴項,而且沒有指定具體版本,纔會從父項目中繼承該項,而且version和scope都讀取自父pom另外若是子項目中指定了版本號,那麼會使用子項目中指定的jar版本。

若是某個項目須要繼承該父項目,基礎配置應該這樣:

<project>  
	  <modelVersion>4.0.0</modelVersion>  
	  <groupId>org.clf.parent.son</groupId>  
	  <artifactId>my-son</artifactId>  
	  <version>1.0</version> 
	  <!-- 聲明將父項目的座標 -->
	  <parent>
		  <groupId>org.clf.parent</groupId>  
		  <artifactId>my-parent</artifactId>  
		  <version>2.0</version>  
		  <!-- 父項目的pom.xml文件的相對路徑。相對路徑容許你選擇一個不一樣的路徑。 -->
		  <!--	默認值是../pom.xml。Maven首先在構建當前項目的地方尋找父項目的pom, -->
		  <!--	其次在文件系統的這個位置(relativePath位置), -->
		  <!--	而後在本地倉庫,最後在遠程倉庫尋找父項目的pom。 -->
		  <relativePath>../parent-project/pom.xml</relativePath>
	  </parent> 
	  
	  <!-- 聲明父項目dependencyManagement的依賴,不用寫版本號 -->
	  <dependencies>
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-web</artifactId>
          </dependency>
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-beans</artifactId>
          </dependency>
      </dependencies>
</project>
複製代碼

###聚合關係 隨着技術的飛速發展和各種用戶對軟件的要求愈來愈高,軟件自己也變得愈來愈複雜,而後軟件設計人員開始採用各類方式進行開發,因而就有了咱們的分層架構、分模塊開發,來提升代碼的清晰和重用。針對於這一特性,maven也給予了相應的配置。

maven的多模塊管理也是很是強大的。通常來講,maven要求同一個工程的全部模塊都放置到同一個目錄下,每個子目錄表明一個模塊,好比

總項目/
  |--- pom.xml 總項目的pom配置文件
  |--- 子模塊1/
   |---pom.xml 子模塊1的pom文件
  |---子模塊2/
   |---pom.xml子模塊2的pom文件 總項目的配置以下:

<project> 
       <modelVersion>4.0.0</modelVersion> 
       <groupId>org.clf.parent</groupId> 
       <artifactId>my-parent</artifactId> 
       <version>2.0</version> 
       
       <!-- 打包類型必須爲pom -->
       <packaging>pom</packaging>
       
       <!-- 聲明瞭該項目的直接子模塊 -->
       <modules>
       <!-- 這裏配置的不是artifactId,而是這個模塊的目錄名稱-->
        <module>module-1</module>
        <module>module-2</module>
        <module>module-3</module>
    </modules>
       
       <!-- 聚合也屬於父子關係,總項目中的dependencies與dependencyManagement、pluginManagement用法與繼承關係相似 -->
       <dependencies>
        ......
       </dependencies>
        
       <dependencyManagement>
        ......
       </dependencyManagement>
 
       <pluginManagement> 
       ......
       </pluginManagement>
</project>
複製代碼

子模塊的配置以下:

<project> 
       <modelVersion>4.0.0</modelVersion> 
       <groupId>org.clf.parent.son</groupId> 
       <artifactId>my-son</artifactId> 
       <version>1.0</version>
       <!-- 聲明將父項目的座標 -->
       <parent>
              <groupId>org.clf.parent</groupId> 
              <artifactId>my-parent</artifactId> 
              <version>2.0</version> 
       </parent>
</project>
複製代碼

繼承與聚合的關係

首先,繼承與聚合都屬於父子關係,而且,聚合 POM與繼承關係中的父POM的packaging都是pom。

不一樣的是,對於聚合模塊來講,它知道有哪些被聚合的模塊,但那些被聚合的模塊不知道這個聚合模塊的存在。對於繼承關係的父 POM來講,它不知道有哪些子模塊繼承與它,但那些子模塊都必須知道本身的父 POM是什麼。

在實際項目中,一個 POM每每既是聚合POM,又是父 POM,它繼承了某個項目,自己包含幾個子模塊,同時確定會存在普通的依賴關係,就是說,依賴、繼承、聚合這三種關係是並存的。

Maven可繼承的POM 元素列表以下:

groupI:項目組 ID ,項目座標的核心元素;

version :項目版本,項目座標的核心元素;

description :項目的描述信息;

organization :項目的組織信息;

inceptionYear :項目的創始年份;

url :項目的 url 地址

develoers :項目的開發者信息;

contributors :項目的貢獻者信息;

distributionManagerment:項目的部署信息;

issueManagement :缺陷跟蹤系統信息;

ciManagement :項目的持續繼承信息;

scm :項目的版本控制信息;

mailingListserv :項目的郵件列表信息;

properties :自定義的 Maven 屬性;

dependencies :項目的依賴配置;

dependencyManagement :醒目的依賴管理配置;

repositories :項目的倉庫配置;

build :包括項目的源碼目錄配置、輸出目錄配置、插件配置、插件管理配置等;

reporting :包括項目的報告輸出目錄配置、報告插件配置等。

相關文章
相關標籤/搜索