Maven 基礎教程

簡介

概述

  • Maven 是一個項目管理和整合工具
  • Maven 為開發者提供了一套完整的構建生命周期框架
  • Maven 簡化了工程的構建過程,并對其標準化,它無縫銜接了編譯、發布、文檔生成、團隊合作和其他任務

環境配置

系統要求

  • JDK
    • Maven 3.3 要求 JDK 1.7 或以上
    • Maven 3.2 要求 JDK 1.6 或以上
    • Maven 3.0/3.1 要求 JDK 1.5 或以上
  • 磁盤
    ????Maven自身安裝需要大約 10 MB 空間。除此之外,額外的磁盤空間將用于你的本地 Maven 倉庫。你本地倉庫的大小取決于使用情況,但預期至少 500 MB。
  • 內存
    ????沒有最低要求。
  • 操作系統
    ????沒有最低要求。

Java安裝

  • Windows
    ????打開命令控制臺,輸入:java -version;輸出:
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) Client VM (build 25.131-b11, mixed mode, sharing)

????如果沒有安裝自行安裝,并配置環境變量。

  • Linux
    ????打開命令終端,輸入:java -version;輸出:
 java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) Client VM (build 25.131-b11, mixed mode, sharing)

????如果沒有安裝自行安裝,并配置環境變量

  • Mac
    ????打開命令終端,輸入:java -version;輸出:
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) Client VM (build 25.131-b11, mixed mode, sharing)

????如果沒有安裝自行安裝,并配置環境變量

Maven安裝

  • 下載安裝文件,選擇最新穩定版本:http://maven.apache.org/download.html
  • 安裝
    • Windows:解壓文件到你想要安裝的位置:D:\Software\apache-maven-3.5.0
    • Linux:解壓文件到你想要安裝的位置:/usr/local/apache-maven
    • Mac:解壓文件到你想要安裝的位置:/usr/local/apache-maven
  • 設置 Maven 環境變量(不清楚的自行查找資料)
    • Windows
      配置M2_HOME環境變量:
      M2_HOME=D:\Software\apache-maven-3.5.0;
      將bin目錄追加到PATH路徑中:%M2_HOME%\bin;
    • Linux
      在/etc/profile文件中添加Maven環境變量,如下所示:
      export M2_HOME=/usr/local/apache-maven/apache-maven-3.5.0
      export PATH=$M2_HOME/bin:$PATH
      然后執行source /etc/profile,使環境變量生效
    • Mac
      在/etc/profile文件中添加Maven環境變量,如下所示:
      export M2_HOME=/usr/local/apache-maven/apache-maven-3.5.0
      export PATH=$M2_HOME/bin:$PATH
      然后執行source /etc/profile,使環境變量生效
    • 驗證 Maven 安裝(有輸出maven版本信息,Java版本信息表示安裝成功)
      - Windows : mvn --version
      - Linux : mvn --version
      - Mac : mvn --version

功能

  • 項目管理工具
  • 依賴管理工具
  • 構建工具

優點

  • 對第三方依賴庫進行了統一的版本管理
  • 統一了構建過程
  • 統一了項目的目錄結構

構建

  • 清理 : mvn clear
  • 編譯 : mvn compile
  • 測試 : mvn test
  • 打包 : mvn package
  • 部署 : mvn deploy
  • 安裝(將jar安裝到本地倉庫): mvn install

使用入門

約定優于配置

????Maven 規定了項目的源代碼,測試代碼,資源文件,編譯包輸出文件,字節碼文件等文件的目錄,統一了項目的目錄結構

  • 源代碼目錄 : /src/main/java
  • 資源文件目錄 : /src/main/resources
  • 測試代碼目錄 : /src/test/java
  • 包輸出目錄 : /target
  • 編譯后的字節碼輸出目錄 : /target/classes

POM文件詳解

  • POM 代表工程對象模型,它是使用Maven工作時的基本組件,是一個xml文件,它被放在工程根目錄下,文件命名為pom.xml;
  • POM 包含了關于工程和各種配置細節的信息,Maven使用這些信息構建工程;
  • POM 也包含了目標和插件,當執行一個任務或者目標時,Maven會查找當前目錄下的POM,從其中讀取所需要的配置信息,然后執行目標;
  • 在創建POM之前,我們首先確定工程組(groupId),及其名稱(artifactId)和版本,在倉庫中這些屬性是工程的唯一標識;
    • 所有的POM文件需要project元素和三個必須的字段:groupId, artifactId,version;
    • 在倉庫中的工程標識為groupId:artifactId:version;
    • POM.xml的根元素是 project,它有三個主要的子節點
      • groupId:這是工程組的標識,它在一個組織或者項目中通常是唯一的;
      • artifactId:這是工程的標識,它通常是工程的名稱,groupId 和 artifactId 一起定義了 artifact 在倉庫中的位置;
      • version:這是工程的版本號,在 artifact 的倉庫中,它用來區分不同的版本;
  • pom.xml文件詳解(參考http://blog.csdn.net/oDeviloo/article/details/52050277
    • 概述
    <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>...</groupId>
            <artifactId>...</artifactId>
            <version>...</version>
            <packaging>...</packaging>
            <!-- 依賴配置 -->
            <dependencies>...</dependencies>
            <parent>...</parent>
            <dependencyManagement>...</dependencyManagement>
            <modules>...</modules>
            <properties>...</properties>
            <!-- 構建配置 -->
            <build>...</build>
            <reporting>...</reporting>
            <!-- 項目信息 -->
            <name>...</name>
            <description>...</description>
            <url>...</url>
            <inceptionYear>...</inceptionYear>
            <licenses>...</licenses>
            <organization>...</organization>
            <developers>...</developers>
            <contributors>...</contributors>
            <!-- 環境設置 -->
            <issueManagement>...</issueManagement>
            <ciManagement>...</ciManagement>
            <mailingLists>...</mailingLists>
            <scm>...</scm>
            <prerequisites>...</prerequisites>
            <repositories>...</repositories>
            <pluginRepositories>...</pluginRepositories>
            <distributionManagement>...</distributionManagement>
            <profiles>...</profiles>
    </project>
    
    • 基本配置
      • modelVersion : pom模型版本,maven2和3只能為4.0.0
      • groupId : 組ID,maven用于定位
      • artifactId : 在組中的唯一ID用于定位
      • version : 項目版本
      • packaging : 項目打包方式,有以下值:pom, jar, maven-plugin, ejb, war, ear, rar, par,默認為jar
    • 依賴配置
      • parent:用于確定父項目的坐標
      <parent>
          <groupId>com.hyn</groupId>
          <artifactId>SIP-parent</artifactId>
          <relativePath></relativePath>
          <version>0.0.1-SNAPSHOT</version>
      </parent>
      groupId:父項目的構件標識符
      artifactId:父項目的唯一標識符
      relativePath:Maven首先在當前項目的找父項目的pom,然后在文件系統的這個位置(relativePath),然后在本地倉庫,再在遠程倉庫找
      version:父項目的版本
      
      • modules : 有些maven項目會做成多模塊的,這個標簽用于指定當前項目所包含的所有模塊。之后對這個項目進行的maven操作,會讓所有子模塊也進行相同操作
      <modules>
         <module>com-a</module>
         <module>com-b</module>
         <module>com-c</module>
      </modules>
      
      • properties : 用于定義pom常量
      <properties>
          <java.version>1.7</java.version>
      </properties>
      這個常量可以在pom文件的任意地方通過${java.version}來引用
      
      • dependencies : 項目相關依賴配置,如果在父項目寫的依賴,會被子項目引用,一般父項目會將子項目公用的依賴引入
      <dependencies>
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>4.12</version>
          </dependency>
      </dependencies>
      
      • dependencyManagement : 在父模塊中定義后,子模塊不會直接使用對應依賴,但是在使用相同依賴的時候可以不加版本號,這樣的好處是,父項目統一了版本,而且子項目可以在需要的時候才引用對應的依賴
      父項目:
      <dependencyManagement>
          <dependencies>
              <dependency>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>4.12</version>
                  <scope>test</scope>
              </dependency>
          </dependencies>
      </dependencyManagement>
      子項目:
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
      </dependency>
      
    • 構建配置
      • build : 用于配置項目構建相關信息
      <build>
              <!--該元素設置了項目源碼目錄,當構建項目的時候,構建系統會編譯目錄里的源碼。該路徑是相對于pom.xml的相對路徑。-->
              <sourceDirectory/>
              <!--該元素設置了項目腳本源碼目錄,該目錄和源碼目錄不同:絕大多數情況下,該目錄下的內容會被拷貝到輸出目錄(因為腳本是被解釋的,而不是被編譯的)。-->
              <scriptSourceDirectory/>
              <!--該元素設置了項目單元測試使用的源碼目錄,當測試項目的時候,構建系統會編譯目錄里的源碼。該路徑是相對于pom.xml的相對路徑。-->
              <testSourceDirectory/>
              <!--被編譯過的應用程序class文件存放的目錄。-->
              <outputDirectory/>
              <!--被編譯過的測試class文件存放的目錄。-->
              <testOutputDirectory/>
              <!--使用來自該項目的一系列構建擴展-->
              <extensions>
                  <!--描述使用到的構建擴展。-->
                  <extension>
                        <!--構建擴展的groupId-->
                        <groupId/>
                        <!--構建擴展的artifactId-->
                        <artifactId/>
                        <!--構建擴展的版本-->
                        <version/>
                  </extension>
              </extensions>
              <!--當項目沒有規定目標(Maven2 叫做階段)時的默認值-->
              <defaultGoal/>
              <!--這個元素描述了項目相關的所有資源路徑列表,例如和項目相關的屬性文件,這些資源被包含在最終的打包文件里。-->
              <resources>
                 <!--這個元素描述了項目相關或測試相關的所有資源路徑-->
                 <resource>
                      <!-- 描述了資源的目標路徑。該路徑相對target/classes目錄(例如${project.build.outputDirectory})。舉個例子,如果你想資源在特定的包里(org.apache.maven.messages),你就必須該元素設置為org/apache/maven/messages。然而,如果你只是想把資源放到源碼目錄結構里,就不需要該配置。-->
                      <targetPath/>
                      <!--是否使用參數值代替參數名。參數值取自properties元素或者文件里配置的屬性,文件在filters元素里列出。-->
                      <filtering/>
                      <!--描述存放資源的目錄,該路徑相對POM路徑-->
                      <directory/>
                      <!--包含的模式列表,例如**/*.xml.-->
                      <includes/>
                      <!--排除的模式列表,例如**/*.xml-->
                      <excludes/>
                </resource>
            </resources>
            <!--這個元素描述了單元測試相關的所有資源路徑,例如和單元測試相關的屬性文件。-->
            <testResources>
                <!--這個元素描述了測試相關的所有資源路徑,參見build/resources/resource元素的說明-->
                <testResource>
                      <targetPath/>
                      <filtering/>
                      <directory/>
                      <includes/>
                      <excludes/>
                </testResource>
            </testResources>
            <!--構建產生的所有文件存放的目錄-->
            <directory/>
            <!--產生的構件的文件名,默認值是${artifactId}-${version}。-->
            <finalName/>
            <!--當filtering開關打開時,使用到的過濾器屬性文件列表-->
            <filters/>
            <!--子項目可以引用的默認插件信息。該插件配置項直到被引用時才會被解析或綁定到生命周期。給定插件的任何本地配置都會覆蓋這里的配置-->
            <pluginManagement>
                 <!--使用的插件列表 。-->
                 <plugins>
                      <!--plugin元素包含描述插件所需要的信息。-->
                      <plugin>
                           <!--插件在倉庫里的group ID-->
                           <groupId/>
                           <!--插件在倉庫里的artifact ID-->
                           <artifactId/>
                           <!--被使用的插件的版本(或版本范圍)-->
                           <version/>
                           <!--是否從該插件下載Maven擴展(例如打包和類型處理器),由于性能原因,只有在真需要下載時,該元素才被設置成enabled。-->
                           <extensions/>
                           <!--在構建生命周期中執行一組目標的配置。每個目標可能有不同的配置。-->
                           <executions>
                                <!--execution元素包含了插件執行需要的信息-->
                                <execution>
                                     <!--執行目標的標識符,用于標識構建過程中的目標,或者匹配繼承過程中需要合并的執行目標-->
                                     <id/>
                                     <!--綁定了目標的構建生命周期階段,如果省略,目標會被綁定到源數據里配置的默認階段-->
                                     <phase/>
                                     <!--配置的執行目標-->
                                     <goals/>
                                     <!--配置是否被傳播到子POM-->
                                     <inherited/>
                                     <!--作為DOM對象的配置-->
                                     <configuration/>
                                </execution>
                           </executions>
                           <!--項目引入插件所需要的額外依賴-->
                           <dependencies>
                                <!--參見dependencies/dependency元素-->
                                <dependency>
                                 ......
                                </dependency>
                           </dependencies>
                           <!--任何配置是否被傳播到子項目-->
                           <inherited/>
                           <!--作為DOM對象的配置-->
                           <configuration/>
                      </plugin>
                 </plugins>
            </pluginManagement>
            <!--使用的插件列表-->
            <plugins>
                 <!--參見build/pluginManagement/plugins/plugin元素-->
                 <plugin>
                      <groupId/>
                      <artifactId/>
                      <version/>
                      <extensions/>
                      <executions>
                           <execution>
                                <id/>
                                <phase/>
                                <goals/>
                                <inherited/>
                                <configuration/>
                           </execution>
                      </executions>
                      <dependencies>
                           <!--參見dependencies/dependency元素-->
                           <dependency>
                            ......
                           </dependency>
                      </dependencies>
                      <goals/>
                      <inherited/>
                      <configuration/>
                 </plugin>
            </plugins>
       </build>
      
      • reporting : 該元素描述使用報表插件產生報表的規范,當用戶執行“mvn site”,這些報表就會運行,在頁面導航欄能看到所有報表的鏈接
      <reporting>
            <!--true,則網站不包括默認的報表。這包括“項目信息”菜單中的報表。-->
            <excludeDefaults/>
            <!--所有產生的報表存放到哪里。默認值是${project.build.directory}/site。-->
            <outputDirectory/>
            <!--使用的報表插件和他們的配置。-->
            <plugins>
                 <!--plugin元素包含描述報表插件需要的信息-->
                 <plugin>
                      <!--報表插件在倉庫里的group ID-->
                      <groupId/>
                      <!--報表插件在倉庫里的artifact ID-->
                      <artifactId/>
                      <!--被使用的報表插件的版本(或版本范圍)-->
                      <version/>
                      <!--任何配置是否被傳播到子項目-->
                      <inherited/>
                      <!--報表插件的配置-->
                      <configuration/>
                      <!--一組報表的多重規范,每個規范可能有不同的配置。一個規范(報表集)對應一個執行目標 。例如,有1,2,3,4,5,6,7,8,9個報表。1,2,5構成A報表集,對應一個執行目標。2,5,8構成B報表集,對應另一個執行目標-->
                      <reportSets>
                           <!--表示報表的一個集合,以及產生該集合的配置-->
                           <reportSet>
                            <!--報表集合的唯一標識符,POM繼承時用到-->
                            <id/>
                            <!--產生報表集合時,被使用的報表的配置-->
                            <configuration/>
                            <!--配置是否被繼承到子POMs-->
                            <inherited/>
                            <!--這個集合里使用到哪些報表-->
                            <reports/>
                           </reportSet>
                      </reportSets>
                  </plugin>
            </plugins>
      </reporting>
      
    • 項目信息
      • name : 給用戶提供更為友好的項目名
      • description : 項目描述,maven文檔中保存
      • url : 主頁的URL,maven文檔中保存
      • inceptionYear : 項目創建年份,4位數字。當產生版權信息時需要使用這個值
      • licenses : 該元素描述了項目所有License列表,應該只列出該項目的license列表,不要列出依賴項目的license列表,如果列出多個license,用戶可以選擇它們中的一個而不是接受所有license
      <license>
          <!--license用于法律上的名稱-->
          <name>...</name>
          <!--官方的license正文頁面的URL-->
          <url>....</url>
          <!--項目分發的主要方式:repo,可以從Maven庫下載 manual, 用戶必須手動下載和安裝依賴-->
          <distribution>repo</distribution>
          <!--關于license的補充信息-->
          <comments>....</comments>
      </license>
      
      • organization : 1.name 組織名 2.url 組織主頁url
      • developers : 項目開發人員列表
      <developers>
          <!--某個開發者信息-->
          <developer>
              <!--開發者的唯一標識符-->
              <id>...</id>
              <!--開發者的全名-->
              <name>...</name>
              <!--開發者的email-->
              <email>...</email>
              <!--開發者的主頁-->
              <url>...<url/>
              <!--開發者在項目中的角色-->
              <roles>
                  <role>Java Dev</role>
                  <role>Web UI</role>
              </roles>
              <!--開發者所屬組織-->
              <organization>sun</organization>
              <!--開發者所屬組織的URL-->
              <organizationUrl>...</organizationUrl>
              <!--開發者屬性,如即時消息如何處理等-->
              <properties>
                  <!-- 和主標簽中的properties一樣,可以隨意定義子標簽 -->
              </properties>
              <!--開發者所在時區,-11到12范圍內的整數。-->
              <timezone>-5</timezone>
          </developer>
      </developers>
      
      • contributors : 項目其他貢獻者列表,同developers
    • 環境設置
      • issueManagement : 目的問題管理系統(Bugzilla, Jira, Scarab)的名稱和URL
      <issueManagement>
          <system>Bugzilla</system>系統類型
          <url>http://127.0.0.1/bugzilla/</url>路徑
      </issueManagement>
      
      • ciManagement : 項目的持續集成信息
      <ciManagement>
          <system>continuum</system>持續集成系統的名字
          <url>http://127.0.0.1:8080/continuum</url>持續集成系統的URL
          <notifiers>構建完成時,需要通知的開發者/用戶的配置項。包括被通知者信息和通知條件(錯誤,失敗,成功,警告)
            <notifier>
              <type>mail</type>通知方式
              <sendOnError>true</sendOnError>錯誤時是否通知
              <sendOnFailure>true</sendOnFailure>失敗時是否通知
              <sendOnSuccess>false</sendOnSuccess>成功時是否通知
              <sendOnWarning>false</sendOnWarning>警告時是否通知
              <address>continuum@127.0.0.1</address>通知發送到的地址
              <configuration></configuration>擴展項
            </notifier>
          </notifiers>
      </ciManagement>
      
      • mailingLists : 項目相關郵件列表信息
      <mailingLists>
          <mailingList>
            <name>User List</name>
            <subscribe>user-subscribe@127.0.0.1</subscribe>訂閱郵件(取消訂閱)的地址或鏈接,如果是郵件地址,創建文檔時,mailto: 鏈接會被自動創建
            <unsubscribe>user-unsubscribe@127.0.0.1</unsubscribe>訂閱郵件(取消訂閱)的地址或鏈接,如果是郵件地址,創建文檔時,mailto: 鏈接會被自動創建
            <post>user@127.0.0.1</post>接收郵件的地址
            <archive>http://127.0.0.1/user/</archive>瀏覽郵件信息的URL
            <otherArchives>
              <otherArchive>http://base.google.com/base/1/127.0.0.1</otherArchive>
            </otherArchives>
          </mailingList>
          .....
      </mailingLists>
      
      • scm : 允許你配置你的代碼庫,供Maven web站點和其它插件使用
      <scm>
          <connection>scm:svn:http://127.0.0.1/svn/my-project</connection>表示我們如何連接到maven的版本庫。connection只提供讀。寫法如:scm:[provider]:[provider_specific]如果連接到CVS倉庫,可以配置如下:scm:cvs:pserver:127.0.0.1:/cvs/root:my-project
          <developerConnection>scm:svn:https://127.0.0.1/svn/my-project</developerConnection>表示我們如何連接到maven的版本庫。developerConnection將提供寫的請求。寫法如:scm:[provider]:[provider_specific]如果連接到CVS倉庫,可以配置如下:scm:cvs:pserver:127.0.0.1:/cvs/root:my-project
          <tag>HEAD</tag>項目標簽,默認HEAD
          <url>http://127.0.0.1/websvn/my-project</url>共有倉庫路徑
      </scm>
      
      • prerequisites : 項目構建的前提
      <prerequisites>
          <maven>2.0.6</maven>
      </prerequisites>
      
      • repositories,pluginRepositories : 依賴和擴展的遠程倉庫列表
      <repositories>
          <repository>
            <releases>
              <enabled>false</enabled>
              <updatePolicy>always</updatePolicy>
              <checksumPolicy>warn</checksumPolicy>
            </releases>
            <snapshots>
              <enabled>true</enabled>
              <updatePolicy>never</updatePolicy>
              <checksumPolicy>fail</checksumPolicy>
            </snapshots>
            <id>codehausSnapshots</id>
            <name>Codehaus Snapshots</name>
            <url>http://snapshots.maven.codehaus.org/maven2</url>
            <layout>default</layout>
          </repository>
      </repositories>
      <pluginRepositories>
       ...
      </pluginRepositories>
      releases, snapshots : 這是各種構件的策略,release或者snapshot。這兩個集合,POM就可以根據獨立倉庫任意類型的依賴改變策略。如:一個人可能只激活下載snapshot用來開發
      enable : true或者false,決定倉庫是否對于各自的類型激活(release 或者 snapshot)
      updatePolicy : 這個元素決定更新頻率。maven將比較本地pom的時間戳(存儲在倉庫的maven數據文件中)和遠程的. 有以下選擇: always, daily (默認), interval:X (x是代表分鐘的整型) , never
      checksumPolicy : 當Maven向倉庫部署文件的時候,它也部署了相應的校驗和文件。可選的為:ignore,fail,warn,或者不正確的校驗和
      layout : 在上面描述倉庫的時候,提到他們有統一的布局。Maven 2有它倉庫默認布局。然而,Maven 1.x有不同布局。使用這個元素來表明它是default還是legacy。
      
      • distributionManagement: 它管理的分布在整個構建過程生成的工件和支持文件
      <distributionManagement>
          ...
          <downloadUrl>http://mojo.codehaus.org/my-project</downloadUrl>
          <status>deployed</status>
      </distributionManagement>
       downloadUrl : 其他pom可以通過此url的倉庫抓取組件
      status : 給出該構件在遠程倉庫的狀態
      none : 默認
      converted : 將被早期Maven 2 POM轉換過來
      partner : 這個項目會從合作者倉庫同步過來
      deployed : 從Maven 2或3實例部署
      verified : 被核實時正確的和最終的
      
      • repository : 指定Maven pom從遠程下載控件到當前項目的位置和方式,如果snapshotRepository沒有被定義則使用repository相關的配置
      <distributionManagement>
          <repository>
            <uniqueVersion>false</uniqueVersion>
            <id>corp1</id>
            <name>Corporate Repository</name>
            <url>scp://repo/maven2</url>
            <layout>default</layout>
          </repository>
          <snapshotRepository>
            <uniqueVersion>true</uniqueVersion>
            <id>propSnap</id>
            <name>Propellors Snapshots</name>
            <url>sftp://propellers.net/maven</url>
            <layout>legacy</layout>
          </snapshotRepository>
          ...
      </distributionManagement>
      id, name : 倉庫的唯一標識
      uniqueVersion : true或false,指明控件部署的時候是否獲取獨立的版本號
      url : repository元素的核心,指定位置和部署協議發布控件到倉庫
      layout : 布局,default或legacy
      
      • site,distribution : 多分布存儲庫,distributionManagement負責定義如何部署項目的網站和文檔
      <distributionManagement>
      ...
      <site>
        <id>mojo.website</id>
        <name>Mojo Website</name>
        <url>scp://beaver.codehaus.org/home/projects/mojo/public_html/</url>
      </site>
      ...
      </distributionManagement>
      
      • id, name, url: 這些元素與distributionManagement repository中的相同

      • relocation : 重新部署-項目不是靜態的,是活的。他們需要被搬到更合適的地方。如:當你的下個成功的開源項目移到Apache下,重命名為org.apache:my-project:1.0 對你項目更有好處

      <distributionManagement>
          ...
          <relocation>
            <groupId>org.apache</groupId>
            <artifactId>my-project</artifactId>
            <version>1.0</version>
            <message>We have moved the Project under Apache</message>
          </relocation>
          ...
      </distributionManagement>
      
      • profiles : profile可以讓我們定義一系列的配置信息(插件等),然后指定其激活條件

坐標與依賴

坐標

  • 作用
    ????坐標是Jar包的唯一標識,Maven通過坐標在倉庫中找到項目所需的Jar包
  • 坐標元素理解
    • maven的坐標元素包括 : groupid、artifactid、version、packaging、classifier
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <packaging>jar</packaging>
    <classifier></classifier>
    
    • groupId : 定義當前maven項目隸屬的實際項目。這和實際項目不同,不一定是一對一的關系,如spring-framework,它對應很多模塊,spring-core,spring-context等,由于Maven中模塊的概念,因此,一個實際項目往往會被劃分成很多模塊。通常和域名反向對應。
    • artifactId : 定義實際項目中的一個maven項目(模塊)。如果是模塊,一般使用實際項目名作為artifactId的前綴。在默認情況下maven生成的構建,其文件名會以artifactId作為開頭:如junit-test生成junit-test-4.12.jar
    • version : 定義項目目前版本
    • packaging : 定義maven項目的打包方式,如jar則生成.jar文件,如果是war則為.war文件,默認jar
    • classifier : 用來定義構建輸出的一些附屬構建。如下情況:有的時候會有jdk版本,這時候就需要<classifier>jdk15</classifier>指定對應jdk版本
    • groupId、artifactId、version、packaging是必須定義的,classifier是不能被直接定義的,因為附屬構件不是項目直接默認生成的,而是由附加的插件幫助生成的。

依賴

  • 3種classpath范圍

    • 測試
    • 編譯
    • 運行
  • 依賴配置

    <dependencies>
        <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <classifier></classifier>
                <scope>test</scope>
                <type></type>
                <optional></optional>
                <exclusions>
                    <exclusion>
                        <artifactId></artifactId>
                        <groupId></groupId>
                    </exclusion>
                </exclusions>
        </dependency>
    </dependencies>
    
    • groupId,artifactId : 在上一章,坐標中已經說明,用于maven對于構件的定位
    • version : 版本
    • classifier : 用來定義構建輸出的一些附屬構建
    • scope : 依賴范圍,有以下值:
      • compile : 默認值,適用于所有階段,會隨著項目一起發布
      • provided : 編譯和測試的有用,在運行時無效,如servlet-api,在編譯和測試的時候需要依賴,但是運行時,容器已經提供,所以不需要再次引入
      • runtime : 只在運行時使用,如JDBC驅動,適用運行和測試階段
      • test : 只在測試時使用,用于編譯和運行測試代碼。不會隨項目發布
      • system : 類似provided,需要再使用systemPath元素顯示制定依賴文件路徑,如下。(由于綁定本地文件,在其他計算機不一定存在,所以盡量不要使用)
      <scope>system</scope>
      <systemPath>${java.home}/lib/rt.jar</systemPath>
      
      • type : 依賴類型,對應項目坐標定義的packaging,默認不用聲明則為jar
      • optional : 標記依賴是否可選,有true和false。如果A依賴于B,但是B只是A在測試時使用,這個時候X依賴于A,那么X就不需要B,那么在x的pom中配置optional為true的話,則在x編譯的時候會忽略B的依賴
      • exclusions : 用來排除傳遞性依賴。比如,我們的項目A中引入了第三方構件B,但是B中又引入了C和D,但是D對于我們的項目有沖突那么我們可以配置如下,將D這個依賴忽略
      <exclusion>
          <artifactId>D</artifactId>
          <groupId>D</groupId>
      </exclusion>
      
  • 依賴范圍

    • 編譯階段(compile):該范圍表明相關依賴是只在工程的類路徑下有效,默認取值,對于編譯、測試、運行三種classpath都有效
    • 供應階段(provided):該范圍表明相關依賴是由運行時的JDK或者網絡服務器提供的,對于編譯和測試classpath有效,但在運行時無效。典型范例:servlet-api
    • 運行階段(runtime):該范圍表明相關依賴在編譯階段不是必須的,但是在執行階段是必須的,對于測試和運行classpath有效,但在對編譯主代碼時無效。典型范例:JDBC
    • 測試階段(test):該范圍表明相關依賴只在測試編譯階段和執行階段,只對測試classpath有效。典型范例:Junit
    • 系統階段(system):該范圍表明你需要提供一個系統路徑
    • 導入階段(import):該范圍只在依賴是一個pom里定義的依賴時使用。同時,當前工程的POM 文件的部分定義的依賴關系可以取代某特定的POM。它不會對三種實際的classpath產生影響


      依賴范圍.png
  • 依賴傳遞性
    假設:A依賴于B,B依賴于C,那么我們就說A對于B是第一直接依賴,B對于C是第二直接依賴,A對于C是傳遞性依賴。

    • 當第二直接依賴的范圍是compile的時候,傳遞性依賴的范圍與第一直接依賴的范圍一致;
    • 當第二直接依賴的范圍是test的時候,依賴不會得以傳遞;
    • 當第二直接依賴的范圍是provided的時候,只傳遞第一依賴范圍也為provided的依賴,且傳遞性依賴的范圍同樣是provided;
    • 當第二直接依賴的范圍是runtime的時候,傳遞性依賴的范圍與第一直接依賴的范圍一致,但compile除外,此時傳遞性依賴范圍為runtime;


      依賴傳遞性.png

      ????左側第一列表示第一直接依賴范圍,最上面一行表示第二直接依賴

  • 依賴調解原則

    • 情景一:我們在項目中分別引入了2個依賴A和B,A又依賴的C,C又依賴了D,B也依賴了D,但是這個時候C依賴的D和B依賴的D的版本是不同的:
      項目----A---C----D
      項目----B---D
      也就是說,當前項目引入了2次D依賴,那么這時,Maven將采用第一原則:路徑最近原則
    • 情景二:我們在項目中分別引入了2個依賴A和B,而A和B又都引入了C,但是,此時A依賴的C和B依賴的C版本是不一致的,那么這個時候Maven如何處理呢?
      這時,第一原則已經不起作用了,
      在Maven2.0.8及之前的版本中和Maven2.0.9之后的版本Maven對于這種情況的處理方式是不一致的,確切的說:
      在Maven2.0.8及之前的版本中Maven究竟會解析哪個版本的依賴,這是不確定的
      在Maven2.0.9之后的版本中,制定了第二原則:第一聲明者優先;就是說,它取決于在POM中依賴聲明的順序
  • 可選依賴

    如果A->B,B中有如下依賴:
    <dependency>
        <groupId>com.my.C</groupId>
        <artifactId>cpt</artifactId>
        <version>1.0.0</version>
        <optional>true</optional>
    </dependency>
    通過上面配置,optional為true,那么A中就不會依賴這個cpt
    

    為什么會有可選依賴呢?是因為某一個項目實現了多個特性,但是我們在面向對象的設計中,有一個原則叫:單一職責性原則,就是強調在一個類只有一項職責,而不是糅合了太多的功能,所以一般這種可選依賴很少會出現。

  • 排除依賴

    • 如果項目A依賴第三方依賴B,B又依賴SNAPSHOT版C那么C的不穩定會影響到A,這個時候就需要排除掉C。還有就是一個傳遞性依賴在中央倉庫中對應的版本不存在,我們就需要排除依賴,然后再導入存在版本的依賴
    • 想實現依賴排除,然后替換成自己想要的依賴,這時我們要用到的一個配置是<exclusions><exclusion>,我們可以使用這一元素聲明排除依賴,然后顯示的聲明我們想要的依賴,在<exclusions>中可以聲明一個或多個<exclusion>來排除一個或多個傳遞性依賴。注:聲明<exclusion>的時候只需要聲明groupId和artifactId就能唯一定位依賴圖中的某個依賴。
    <dependency>
        <groupId>com.ys.b</groupId>
        <artifactId>pro-b</artifactId>
        <version>1.0.1</version>
    <!--排除依賴-->
        <exclusions>
            <exclusion>
                <groupId>com.ys.c</groupId>
                <artifactId>pro-c</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- 引入正確依賴 -->
    <dependency>
        <groupId>com.ys.c</groupId>
        <artifactId>pro-c</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  • 歸并依賴

    • 如果我們在pom中引入了多個依賴,比如spring相關的有core,beans,context等,這樣如果我們需要修改版本,需要一個一個修改,十分麻煩,這個時候就可以使用properties來定義:
    <properties>
        <springframework.version>2.5.6</springframework.version>
    </properties>
    
    • 這個時候我們就可以在聲明依賴的時候使用${springframework.version}來替換具體的版本號:
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${springframework.version}</version>
    </dependency>
    
  • 查看依賴

    • mvn dependency:list以列表形式解析依賴
    • mvn dependency:tree以樹的形式展示
    • mvn dependency : analyze分析當前當前項目的依賴,該命令執行結果的兩個重要部分:
      • Used undeclared dependencies: 表示項目中使用到的,但是沒有顯示聲明的依賴
      • Unused declared dependencies: 表示項目中未使用的,但顯示聲明的依賴
        注:dependency : analyze只會分析編譯主代碼和測試代碼需要用到的依賴,一些執行測試和運行時需要的依賴它無法發現。

生命周期

概述

  • Maven的生命周期就是對所有的構建過程進行抽象和統一。包含了項目的清理、初始化、編譯、測試、打包、集成測試、驗證、部署和站點生成等幾乎所有的構建步驟
  • 典型的構建生命周期


    構建生命周期.png

三套生命周期

  • clean生命周期
    • 在進行真正的構建之前進行一些清理工作
    • 包含三個phase
      • pre-clean:執行清理前需要完成的工作
      • clean:清理上一次構建生成的文件
      • post-clean:執行清理后需要完成的工作
  • default生命周期
    • 構建的核心部分,編譯,測試,打包,部署等等
    • Maven 的主要生命周期,被用于構建應用。包括圖中的 23 個階段


      階段.png

      ????當一個階段通過 Maven 命令調用時,例如 mvn compile,只有該階段之前以及包括該階段在內的所有階段會被執行。
      ????不同的 maven 目標將根據打包的類型(JAR / WAR / EAR),被綁定到不同的 Maven 生命周期階段。

  • site生命周期
    • 生成項目報告,站點,發布站點
    • 包括四個phase
      • pre-site:生成項目站點之前需要完成的工作
      • site:生成項目站點文檔
      • post-site:生成項目站點之后需要完成的工作
      • site-deploy:將項目站點發布到服務器

命令行

  • mvn clean : 調用clean生命周期的clean階段,實際執行pre-clean和clean階段
  • mvn test : 調用default生命周期的test階段,實際執行test以及之前所有階段
  • mvn clean install : 調用clean生命周期的clean階段和default的install階段,實際執行pre-clean和clean,install以及之前所有階段
  • mvn clean install -Dmaven.test.skip=true : 調用clean生命周期的clean階段和default的install階段,實際執行pre-clean和clean,install以及之前所有階段,但跳過test階段

倉庫

本地

  • Maven 本地倉庫是機器上的一個文件夾。它在你第一次運行任何 maven 命令的時候創建。
  • Maven 本地倉庫保存你的工程的所有依賴(library jar、plugin jar 等)。當你運行一次 Maven 構建,Maven 會自動下載所有依賴的 jar 文件到本地倉庫中。它避免了每次構建時都引用存放在遠程機器上的依賴文件。
  • Maven本地倉庫的默認位置:無論是Windows還是Linux,在用戶的目錄下都有一個.m2/repository/的倉庫目錄,這就是Maven倉庫的默認位置。
  • 如何更改maven默認的本地倉庫的位置:這里要引入一個新的元素:localRepository,它是存在于maven的settings.xml文件中
    • 更改配置用戶范圍的本地倉庫:先在/.m2/目錄下創建settings.xml文件,然后在~/.m2/settings.xml,設置localRepository元素的值為想要的倉庫地址
    <settings>
        <localRepository>D:\maven_new_repository</localRepository>
    </settings>
    
    • 更改配置全局范圍的本地倉庫:在M2_HOME/conf/settings.xml中更改配置,更改配置的方法同上(注:此時更改后,所有的用戶都會受到影響,而且如果maven進行升級,那么所有的配置都會被清除,所以要提前復制和備份M2_HOME/conf/settings.xml文件,故:一般情況下不推薦配置全局的settings.xml)

中央

  • Maven 中央倉庫是由 Maven 社區提供的倉庫,其中包含了大量常用的庫。
  • 中央倉庫的關鍵概念:
    • 這個倉庫由 Maven 社區管理。
    • 不需要配置。
    • 需要通過網絡才能訪問。
  • settings配置
<repositories>
           <repository>
                     <id>central</id>
                     <name>Central Repository</name>
                     <url>http://repo.maven.apache.org/maven2</url>
                     <layout>default</layout>
                     <snapshots>
                         <enabled>true</enabled>
                         <updatePolicy>always</updatePolicy>
                         <checksumPolicy>always</checksumPolicy>
                     </snapshots>
            </repository>
    </repositories>
image.png

遠程(私服)

  • 私服是一種特殊的遠程倉庫,他是架設在局域網內的倉庫服務,私服代理廣域網上的遠程倉庫,供局域網內的Maven用戶使用。當Maven需要下載構件的時候,它從私服請求,如果私服上不存在改構件,則從外部的遠程倉庫下載,同時緩存在私服之上,然后為Maven下載請求提供服務,另外,對于第三方的jar無法從倉庫下載(JDBC驅動)可以從本地上傳到私服供客戶端下載。
  • 特性
    • 節省自己的外網帶寬:減少重復請求造成的外網帶寬消耗
    • 提高穩定性,增強控制:Internet不穩定的時候,maven構建也會變的不穩定,一些私服軟件還提供了其他的功能
    • 加速Maven構件:如果項目配置了很多外部遠程倉庫的時候,構建速度就會大大降低
    • 部署第三方構件:有些構件無法從外部倉庫獲得的時候,我們可以把這些構件部署到內部倉庫(私服)中,供內部maven項目使用
    • 降低中央倉庫的負荷:maven中央倉庫被請求的數量是巨大的,配置私服也可以大大降低中央倉庫的壓力
  • 配置
    • 配置遠程倉庫將引入新的配置元素:<repositories><repository>,在<repositories>元素下,可以使用<repository>子元素聲明一個或者多個遠程倉庫。
    <repositories>
        <repository>
            <id>jboss</id>
            <name>JBoss Repository</name>
            <url>http://repository.jboss.com/maven2/</url>
            <releases>
                <updatePolicy>daily</updatePolicy><!-- never,always,interval n -->
                <enabled>true</enabled>
                <checksumPolicy>warn</checksumPolicy><!-- fail,ignore -->
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <layout>default</layout>
        </repository>
    </repositories>
    <updatePolicy>元素:表示更新的頻率,值有:never, always,interval,daily, daily 為默認值
    <checksumPolicy>元素:表示maven檢查和檢驗文件的策略,warn為默認值
    
    • 出于安全方面的考慮,有時我們要對遠程倉庫的訪問進行認證,一般將認證信息配置在settings.xml中:
    <servers>
        <server>
            <id>same with repository id in pom</id>
            <username>username</username>
            <password>pwd</password>
        </server>
    </servers>
    這里的id必須與POM中需要認證的repository元素的Id一致
    
    • 如何將生成的項目部署到遠程倉庫需要在POM中進行配置,這里有新引入了一個元素:distributionManagement;distributionManagement包含了2個子元素:repository和snapshotRepository, 前者表示發布版本構件的倉庫,后者表示快照版本的倉庫
      這兩個元素都需要配置 id(該遠程倉庫的唯一標識),name,url(表示該倉庫的地址);
      向遠程倉庫中部署構件,需要進行認證。配置同上,配置正確后運行: mvn clean deploy
 <distributionManagement>
    <repository>
        <id>deploymentRepo_releases</id>
        <name>Nexus Release Repository</name>
        <url>http://localhost:8081/nexus/content/repositories/releases/</url>
    </repository>
    <snapshotRepository>
        <id>deploymentRepo_snapshots</id>
        <name>Nexus Snapshot Repository</name>
        <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
    </snapshotRepository>
</distributionManagement>

Maven依賴搜索順序

  • 步驟一:在本地倉庫中搜索,如果找不到,執行步驟二,如果找到了則執行其他操作
  • 步驟二:在中央倉庫中搜索,如果找不到,并且有一個或多個遠程倉庫已經設置,則執行步驟四,如果找到了則下載到本地倉庫中已被將來引用。
  • 步驟三: 如果遠程倉庫沒有被設置,Maven 將簡單的停滯處理并拋出錯誤(無法找到依賴的文件)。
  • 步驟四:在一個或多個遠程倉庫中搜索依賴的文件,如果找到則下載到本地倉庫已被將來引用,否則 Maven 將停止處理并拋出錯誤(無法找到依賴的文件)。

鏡像

  • 如果倉庫X可以提供倉庫Y存儲的所有內容,那么就可以認為X是Y的一個鏡像,某些情況下使用鏡像可以提高項目構建效率。
  • settings配置
  <mirrors>
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
  </mirrors>
  • 鏡像的意思是,當你訪問mirrorOf的倉庫時,就會轉到對應的鏡像url中請求對應的資源。一般鏡像都是和私服結合使用。由于私服可以代理任何外部的公共倉庫(包括中央倉庫),因此,對于組織內部的Maven用戶來說,使用一個私服地址就等于使用了所有需要的外部倉庫,這個可以將配置集中到私服,從而簡化Maven本身的配置。在這種情況下,任何需要的構件都可以從私服中獲得,私服就是所有倉庫的鏡像。這時候那個鏡像如下配置:
  <mirrors>
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>*</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
  </mirrors>

聚合與繼承

聚合

  • 將多個項目放到一起運行
  • 用法
    • packaging是pom
    • 定義modules
    <modules>
        <module>SIP-utils</module>
        <module>SIP-web</module>
        <module>SIP-sql</module>
        <module>SIP-core</module>
    </modules>
    每個module的值都是一個當前POM的相對目錄
    
  • 為了快速構建項目

繼承

  • 抽取各模塊相同的依賴和插件
  • 子項目中pom文件配置:
<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>
  • 父項目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>
  • 可被繼承的pom元素:
    • groupId:項目組ID,項目坐標的核心元素
    • version: 項目版本, 項目坐標的核心元素
    • description: 項目的描述信息
    • organization: 項目的組織信息
    • inceptionYear: 項目的創始年份
    • url: 項目的URL地址
    • developers: 項目開發者信息
    • contributors: 項目的貢獻者信息
    • distributionManagement: 項目的部署配置
    • issueManagement: 項目的缺陷跟蹤系統信息
    • ciManagement: 項目的持續集成系統信息
    • scm: 項目的版本控制系統信息
    • mailingLists: 項目的郵件列表信息
    • properties: 自定義的maven屬性
    • dependencies: 項目的依賴配置
    • dependencyManagement: 項目的依賴管理配置
    • repositories: 項目的倉庫配置
    • build: 包括項目的源碼目錄配置、輸出目錄配置、插件配置、插件管理配置等
    • reporting: 包括項目的報告輸出目錄配置、報告插件配置等

其他

常用命令

  • mvn archetype:generate -DgroupId=com.companyname.bank -DartifactId=consumerBanking -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false:創建一個簡單的Java工程
  • mvn archetype:generate -DgroupId=com.companyname.automobile -DartifactId=trucks -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false:創建一個java的web工程
  • mvn clean:清理(刪除target目錄下編譯內容)
  • mvn compile:編譯項目
  • mvn test-compile:編譯測試程序
  • mvn test:運行測試
  • mvn package:打包發布
  • mvn package -Dmaven.test.skip=ture:打包時跳過測試
  • mvn site:生成站點目錄
  • mvn site-deploy:生成站點目錄并發布
  • mvn install:安裝當前工程的輸出文件到本地倉庫
  • mvn install:install-file -DgroupId=<groupId> -DartifactId=<artifactId> -Dversion=1.0.0 -Dpackaging=jar -Dfile=<myfile.jar>:安裝指定文件到本地倉庫
  • mvn help:effective-pom:查看實際pom信息
  • mvn dependency:tree:分析項目的依賴信息

settings文件詳解

  • 概覽
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
           http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <localRepository/>
  <interactiveMode/>
  <offline/>
  <pluginGroups/>
  <servers/>
  <mirrors/>
  <proxies/>
  <profiles/>
  <activeProfiles/>
</settings>
1.用戶級別
    ${user.home}/.m2/settings.xml
    可以通過指令 -s /path/to/user/settings.xml
2.全局級別
    ${maven.home}/conf/settings.xml.
    可以通過指令 -gs /path/to/global/settings.xml
  • localRepository
    • localRepository用于構建系統的本地倉庫的路徑。 默認的值是${user.home}/.m2/repository。
    • Default:${user.home}/.m2/repository<localRepository>/path/to/local/repo</localRepository>
  • interactiveMode:interactiveMode 用于決定maven是否在需要輸出的時候提示你,默認true。如果是false,它將使用合理的默認值,或者基于一些設置。
  • offline:決定maven是否在構建的時候進行網絡傳輸。 默認false,表示聯網狀態,true為取消聯網。 在某些情況下設置為true是很有用的,比如jar無法從網上下載等
  • pluginGroups:pluginGroups 插件組
<pluginGroups>
    <pluginGroup>org.mortbay.jetty</pluginGroup>
</pluginGroups>
  • proxies:此項用于設置http代理,有時候由于安全問題,需要配置http代理,通過代理服務才能正常訪問外部倉庫下載資源可以ping repo1.maven.org來訪問中央倉庫
<proxies>
    <proxy>
      <id>optional</id>
      <active>true</active>
      <protocol>http</protocol><!--代理協議-->
      <username>proxyuser</username>
      <password>proxypass</password>
      <host>proxy.host.net</host>
      <port>80</port>
     <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>
</proxies>
id:proxy的唯一標識,用來區別proxy元素。
active:表示是否激活代理,如果配置多個,默認是第一個生效
username,password:提供連接代理服務器時的認證。
host,port:主機地址,端口號
nonProxyHosts:用來表示哪些主機名不需要代理,可以用|來分割多個,此外也支持通配符
如:*.goole.com表示所有以goole.com結尾的都不需要通過代理
  • servers:這是一個認證配置的列表,根據系統中使用的server-id控制。認證配置在maven連接到遠程服務時使用。
<servers>
    <!--使用登錄方式-->
    <server>
          <id>deploymentRepo</id>
          <username>repouser</username>
          <password>repopwd</password>
        </server>
        <!-- 使用秘鑰認證 -->
        <server>
          <id>siteServer</id>
          <privateKey>/path/to/private/key</privateKey>
          <passphrase>可空</passphrase>
        </server>
</servers>
  • mirrors:指定鏡像倉庫位置用于從遠程倉庫下載資源
<mirrors>
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
</mirrors>
id:用于繼承和直接查找,唯一
mirrorOf:鏡像所包含的倉庫的Id
name:唯一標識,用于區分鏡像站
url:鏡像路徑
  • profiles
    • settings.xml中時意味著該profile是全局的,所以只能配置范圍寬泛一點配置信息,比如遠程倉庫等。而一些比較細致一點的需要定義在項目的pom.xml中。
    • profile可以讓我們定義一系列的配置信息,然后指定其激活條件。
    • 根據每個profile對應不同的激活條件和配置信息,從而達到不同環境使用不同配置。
    • 例子:通過profile定義jdk1.5以上使用一套配置,jdk1.5以下使用另外一套配置;或者通過操作系統來使用不同的配置信息。
    • settings.xml中的信息有repositories、pluginRepositories和properties。定義在properties的值可以在pom.xml中使用。
    <profiles>
        <profile>
               <id>test</id>
               <activation>
                   <activeByDefault>false</activeByDefault>
                   <jdk>1.5</jdk>
                   <os>
                         <name>Windows XP</name>
                         <family>Windows</family>
                         <arch>x86</arch>
                         <version>5.1.2600</version>
                    </os>
                    <property>
                         <name>mavenVersion</name>
                         <value>2.0.3</value>
                    </property>
                    <file>
                          <exists>${basedir}/file2.properties</exists>
                          <missing>${basedir}/file1.properties</missing>
                    </file>
                </activation>
        </profile>
    </profiles>
    jdk:檢測到對應jdk版本就激活
    os:針對不同操作系統
    property:當maven檢測到property(pom中如${name}這樣的)profile將被激活
    file:如果存在文件,激活,不存在文件激活
    
  • properites
    • Maven的屬性是值占位符,就像Ant中的一樣。如果X是一個屬性的話,在POM中可以使用${X}來進行任意地方的訪問。他們來自于五種不同的風格,所有都可以從settings.xml文件中訪問到。
    • env.x:“env.”前綴會返回當前的環境變量。如${env.PATH}就是使用了$path環境變量(windosws中的%PATH%)。
    • project.x:一個點“.”分割的路徑,在POM中就是相關的元素的值。例如:<project><version>1.0</version></project>就可以通過${project.version}來訪問。
    • settings.x:一個點“.”分割的路徑,在settings.xml中就是相對應的元素的值,例如:<settings><offline>false</offline></settings>就可以通過${settings.offline}來訪問。
    • Java系統屬性:通過java.lang.System.getProperties()來訪問的屬性都可以像POM中的屬性一樣訪問,例如:${java.home}
    • x:被<properties/>或者外部文件定義的屬性,值可以這樣訪問${someVar}
    <profiles>
        <profile>
          ...
          <properties>
            <user.install>${user.home}/our-project</user.install>
          </properties>
          ...
        </profile>
    </profiles>
    
  • Repositories:Repositories是遠程項目集合maven用來移植到本地倉庫用于構建系統。如果來自本地倉庫,Maven調用它的插件和依賴關系。不同的遠程倉庫可能包含不同的項目,當profile被激活,他們就會需找匹配的release或者snapshot構件。
<profiles>
    <profile>
      ...
      <repositories>
        <repository>
          <id>codehausSnapshots</id>
          <name>Codehaus Snapshots</name>
          <releases>
            <enabled>false</enabled>
            <updatePolicy>always</updatePolicy>
            <checksumPolicy>warn</checksumPolicy>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
            <checksumPolicy>fail</checksumPolicy>
          </snapshots>
          <url>http://snapshots.maven.codehaus.org/maven2</url>
          <layout>default</layout>
        </repository>
      </repositories>
      <pluginRepositories>
        ...
      </pluginRepositories>
      ...
    </profile>
</profiles>
releases,snapshots:這是各種構件的策略,release或者snapshot。這兩個集合,POM就可以根據獨立倉庫任意類型的依賴改變策略。如:一個人可能只激活下載snapshot用來開發。
enable:true或者false,決定倉庫是否對于各自的類型激活(release 或者 snapshot)。
updatePolicy: 這個元素決定更新頻率。maven將比較本地pom的時間戳(存儲在倉庫的maven數據文件中)和遠程的. 有以下選擇: always, daily (默認), interval:X (x是代表分鐘的整型) , never.
checksumPolicy:當Maven向倉庫部署文件的時候,它也部署了相應的校驗和文件。可選的為:ignore,fail,warn,或者不正確的校驗和。
layout:在上面描述倉庫的時候,提到他們有統一的布局。Maven 2有它倉庫默認布局。然而,Maven 1.x有不同布局。使用這個元素來表明它是default還是legacy。
  • activeProfiles:每個activeProfile元素對應一個profile id的值,任何profile id被定義到activeProfile的profile將被激活。
<activeProfiles>
    <activeProfile>alwaysActiveProfile</activeProfile>
    <activeProfile>anotherAlwaysActiveProfile</activeProfile>
</activeProfiles>

????整理文章主要為了自己日后復習用,文章中可能會引用到別的博主的文章內容,如涉及到博主的版權問題,請博主聯系我。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,915評論 18 139
  • |-1-更新內容[6.從倉庫解析依賴的機制(重要)] 1Maven倉庫作用 倉庫用來存儲所有項目使用到構件,在ma...
    zlcook閱讀 6,137評論 0 25
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,950評論 6 342
  • 18-白皇后-小咪 今天的記憶色塊很有規律 1.左上角那一塊周圍的都沒有涂色,優先記憶 2.1和2是對稱方位尖角相...
    小咪小少女閱讀 173評論 0 0
  • 1.愿景 我們要到哪里去 我們未來是怎樣的 我們的目標是什么 2.SMART原則 明確、可衡量、可達到、有相關性、...
    流浪思維記閱讀 369評論 0 0