簡介
概述
- 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
- Windows
功能
- 項目管理工具
- 依賴管理工具
- 構建工具
優點
- 對第三方依賴庫進行了統一的版本管理
- 統一了構建過程
- 統一了項目的目錄結構
構建
- 清理 : 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中依賴聲明的順序
- 情景一:我們在項目中分別引入了2個依賴A和B,A又依賴的C,C又依賴了D,B也依賴了D,但是這個時候C依賴的D和B依賴的D的版本是不同的:
-
可選依賴
如果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>
遠程(私服)
- 私服是一種特殊的遠程倉庫,他是架設在局域網內的倉庫服務,私服代理廣域網上的遠程倉庫,供局域網內的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>
????整理文章主要為了自己日后復習用,文章中可能會引用到別的博主的文章內容,如涉及到博主的版權問題,請博主聯系我。