目錄
什麼是maven
Maven的下載下傳與安裝
相關配置
配置倉庫
配置jdk版本
配置鏡像
Maven項目建立
目錄結構介紹
手動建立maven項目maven01
自動建構項目&項目骨架
Eclipse中配置maven和建立項目
Idea中使用maven
maven的其他知識點
pom.xml檔案詳解
安裝指定的位置的jar到本地倉庫指令
Maven中的dependencyManagement 意義
plugins和pluginManagement的差別概述
什麼是maven
maven是可以通過一小段描述資訊來管理項目的建構,報告和文檔的項目管理工具軟體。通俗的了解,maven是一個工具,用來主要用來管理項目所需要的依賴(jar包),打包項目等
Maven的下載下傳與安裝
網址http://maven.apache.org/download.cgi
Window就下載下傳二進制檔案,下載下傳之後解壓即可
首先配置環境變量,和配置jdk一樣
最後通過指令mvn -v 或mvn -version即可檢視到Maven是否安裝成功,安裝成功即可看到相關版本資訊
注意:每次配完之後都要重新開啟cmd
這裡還需要強調一點就是安裝Maven之前務必確定正确安裝了JDK,我們這裡安裝的maven-3.3.3必須要裝JDK1.7+,否則Maven無法正常使用,關于這一點我們在官網的Documentation的Download目錄下可以看到:
是以需要注意一下JDK的版本,如果你以後使用IDE去建立Maven項目的話也務必要配置好正确版本的JDK。
相關配置
配置倉庫
當我們建立項目後,項目中需要的jar包回來到我們指定的倉庫中加載,如果倉庫中找不到如何處理?處理方式有以下三種
配置jdk版本
使用Maven建立的java項目,需要可以在配置檔案中設定預設使用的jdk版本。 修改Maven安裝目錄的conf/setting.xml檔案,找到配置jdk的<profile>節點: 注意不要直接複制,因為不同版本的maven中配置不同,找到你原來的節點,在原來的基礎下面複制這個節點上修改。 <profile> <id>jdk18</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile> 上面的配置指定的JDK版本是1.8 |
配置鏡像
Maven的中央倉庫是在國外的,如果網絡有限制,會導緻jar包下載下傳的很慢或者無法下載下傳。可以在網上找一些國内的鏡像: 找到setting.xml的<mirrors>節點,加入如下内容: <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> 因為maven是國外的,每次通路特别慢,自己可以網上找的一個阿裡雲的鏡像,也可以自己搜其它的進行配置。 (這個自己本地如果沒有倉庫就配置,如果有可以不配) |
Maven項目建立
目錄結構介紹
使用Maven管理項目的話,那麼項目的結構目錄務必要按照Maven約定的目錄結構來建立項目,我們在官方文檔中可以看到Maven提供的目錄結構圖:
顯而易見,每個目錄下應當放什麼樣類型的檔案都說的很清楚了,一般情況下常用的是以下4個目錄,
src/main/java 存放項目的java類源檔案,即:Xxx.java
src/main/resources 存放項目的資源檔案,如spring、mybatis的配置檔案等等
src/test/java 存放項目的用于測試的java類源檔案,即:XxxTest.java
src/test/resources 存放項目的測試相關的資源檔案
在上面的上面的圖中我們還看到了一個pom.xml配置檔案,這個檔案很重要,它是Maven的核心配置檔案,我們的項目版本,jar包依賴等等都以标簽的形式儲存在了這個配置檔案中,項目中會詳細說明;
手動建立maven項目maven01
我們知道了maven項目所要遵循的結構格式,先不使用eclipse和idea建立項目,手動建立一個maven項目,不過在此之前我們需要一個包含檔案頭的pom.xml的模闆檔案,在哪找呢?很簡單,現在許多開源項目都是通過maven去打包的,比如mybatis,我們找到mybatis的jar包,解壓後可以在目錄中看到pom.xml檔案:複制頭檔案即可
<?xml version="1.0" encoding="UTF-8"?> <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/maven-v4_0_0.xsd"> </project> |
然後建立項目,依據Maven約定的目錄結建構立檔案夾以及pom.xml檔案,如下圖所示,首先在src/main/java目錄下建立我們的java類源檔案:
代碼很簡單,傳回一個字元串:
package com.wl.maven01.model;
public class HelloWorld{
public String sayHello(){
return "Hello World!";
}
}
接下來在src/test/java目錄下建立用于測試的測試類java源檔案:
主要用于測試HelloWorld類的sayHello方法的傳回值與斷言是否一緻,代碼如下:
package com.wl.maven01.model;
import org.junit.*;
import org.junit.Assert.*;
public class HelloWorldTest{
@Test
public void testHello(){
Assert.assertEquals("Hello World!",new HelloWorld().sayHello());
}
}
這裡引入了junit的jar包,Maven的一大特點就是通過pom.xml去管理jar包以及相關依賴,我們隻需要在配置檔案中寫入依賴的相關配置,那麼Maven就會自動從Maven中央倉庫中将我們的jar包下載下傳到本地倉庫,關于依賴和倉庫的概念後面再細說,這裡我們隻需要知道我們的Maven項目不必再手動将jar包add到項目的classpath中,而是在pom.xml中聲明即可,Maven會自動下載下傳到本地。下面看看我們的pom.xml檔案:
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wl.maven01</groupId>
<artifactId>maven-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
</project>
可以看到我們通過<dependency>元素來聲明了我們的依賴jar包,當我們編輯pom檔案後儲存的時候Maven就會自動去下載下傳jar包了,這也是Maven最主要的優點之一。Pom中的
modelVersion ——描述這個pom.xml檔案是遵從哪個版本的項目描述符,maven3應當設定成4.0.0
groupId ——指明了建立項目的組織的唯一辨別符,一般就是包名了
artifactId ——指的是項目中的主要的子產品名(primary artifact),預設命名方式是“項目名-子產品名”
version ——指的是項目子產品的版本,通常使用的是Maven的快照版本(例如:0.0.1-SNAPSHOT)
配置檔案和java檔案都寫好之後,我們就可以通過Maven去編譯、測試以及打包我們項目了。
這裡總結一下maven常用的指令
mvn Clean清理編譯的檔案
mvn compile編譯主目錄檔案
mvn test 編譯并運作test裡的代碼
mvn package打包
mvn install 将項目釋出到本地倉庫
首先是編譯項目,我們在指令行下切換到我們Maven項目的根路徑下:
在上圖中我們可以看到Compiling 1 source file to xxx BUILD SUCCESS字樣,即編譯了一個源檔案到D盤的Maven01/target/classes目錄下,下面我們再觀察一下之前的Maven項目目錄,會多出一個target目錄
通過mvn test指令來對運作我們Maven項目的單元測試:
Running com.wl.maven01.model.HelloWorldTest BUILD SUCCESS字樣,顯而易見的已經成功運作了我們的測試類。在target檔案夾下又多出了2個檔案夾
surfire-reports目錄用于存放生成的測試報告,而test-classes同理肯定是用于存放測試類編譯後的位元組碼檔案了。
打包指令——mvn package:
如上圖所示,Building jar:xxx.jar BUILD SUCCESS,很明顯打包成功,打好的jar包在D:/Maven01/target根目錄下,我們可以在指定的目錄中看到它
Clean指令
可以看到當我們執行了clean指令之後,顯示了Deleting e:/Maven01/target,即删除了target檔案夾,最後顯示了BUILD SUCCESS字樣即執行成功。
然後執行install指令,執行之後顯示Installing F:/MavenTest02/pom.xml to E:/apache-maven-3.3.3/repo...
不難發現我們的MavenTest02已經成功打包并作為一個普通的構件安裝到了我們本地的Maven倉庫中。這樣當我們在其他的Maven項目如果需要用到Maven01中的類時,就可以将它作為普通的依賴導入到pom.xml中即可,例如這樣:
<dependency>
<groupId>com.wl</groupId>
<artifactId>Maven01</artifactId>
<version>SNAPSHOT-0.0.1</version>
</dependency>
自動建構項目&項目骨架
在這之前我們都是手動的去建立目錄檔案夾,在實際開發中顯然是不可取的,實際開發肯定是通過IDE去建立項目,而IDE也無法自動建立,而是間接的調用了Maven的項目建構指令,那麼接下來就學習一下建構指令的提供者——Archetypes插件,首先看一下官網的介紹:
可以在官網的這段簡介中看到,使用archetype插件可以建立Maven項目,而且一個archetype會提供許多項目模闆(骨架),上圖中的代碼也給出了archetype插件的使用指令和參數名。通常情況下我們使用mvn archetype:generate指令即可,如官方文檔中Introdution to Archetypes中介紹的一樣,
下面我們在指令行實際操作一下試試看,切換到F:/MavenTest04(空目錄)後,輸入mvn archetype:generate,
如果是第一次運作這個指令則會需要一些時間去自動下載下傳jar包,最後我們可以看到Choose a number or apply filter,Maven的Archetype插件為我們提供了多達1393個項目模闆可供選擇,我們可以輸入模闆編号來選擇,或者輸入過濾器進行過濾,過濾器也很簡單,比如我們需要建立web項目,那麼輸入“web+回車”就會篩選出所有web項目骨架了。當然我們如果不知道選擇什麼,也可以什麼也不輸入直接敲回車,就會選擇預設的模闆,其實就是一個普通java項目了。
接下來我們根據提示需要依次輸入版本号、groupId、artifactId、version、package并輸入“Y”來确認之後,我們就會在指定的目錄下成功建立這個預設骨架的Maven項目了:
如上圖所示,我們可以看到在F:/MavenTest04目錄下成功建立了maven04-model這個項目:
最後我們直接安裝并運作一下這個項目,通過mvn install将我們這個項目編譯打包并安裝到本地倉庫,并通過java指令去運作jar包:
可以看到當我們将目錄切換到MavenTest04/maven04-model目錄下之後并執行mvn install指令,我們的項目正常編譯打包并安裝到了我們本地的Maven倉庫,那麼我們這個項目的jar包應該在target的根目錄下,我們嘗試執行一下:
成功輸出了Hello World!沒有任何問題,這就是我們的Archetype插件建立的項目了。
我們還可以通過指定參數名的方式去建立指定的某種骨架的項目,在上面的“How do I make my first Maven Project”的截圖中我們可以看到官方提供的幾個參數,分别是-DarchetypeGroupId、-DgroupId、-DartifactId。比如依舊建立上面的那個預設項目的話,我們可以直接運作這個指令:
mvn archetype:generate -DgroupId=com.wl.maven04 -DartifactId=maven04-model -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false |
這樣就避免了我們去選擇,而直接建立預設的骨架——maven-archetype-quickstart的項目了。我們在之前運作mvn archetype:generate指令時也看到了這個插件為我們提供的骨架有1393之多,即使我們使用了filter也很難選擇,不過沒關系,官方給我們提供了幾個最常用的骨架以供選擇:
如上圖所示,可以看到有web project的骨架,simple maven project的骨架等等,我們根據需要自行選擇即可,再補充一個很常用的骨架:maven-archetype-webapp,我們在建立web項目的時候更多的應該會選擇這個骨架。下面我們就用這個骨架建立一個web項目并在浏覽器Hello World!首先建立一個新的目錄MavenWebTest,在指令行中切換到該目錄并輸入指令:
可以看到我們輸入了指令并指定參數之後,成功在我們的F:/MavenWebTest目錄下建立了mavenweb-model這個web項目,建立完成後我們把這個項目導入到MyEclipse中看一下目錄結構(注意MyEclipse的話需要通過maven插件提供的導入來導入maven項目,
可以發現src/main下多了一個webapp目錄,而這個目錄其實就和我們普通web項目的webroot或webcontent是一樣的了,我們的web相關檔案(js、jsp、css)等都應該放在這個目錄下了,下面再看一下這個自動生成的maven web項目的pom檔案吧:注意一下packaging元素,它的值是war,也就說明我們執行mvn package打包項目的時候會在target目錄下生成一個war包:
如上圖所示,确實如此。我們把這個war包拷貝到tomcat的webapps目錄并啟動tomcat
Eclipse中配置maven和建立項目
如果是eclipse,首先要安裝M2e插件安裝,但是eclipe MARS2版本的不用安
設定完成,建立項目
寫坐标
修改pom.xml檔案
<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>com.javayihao.test</groupId>
<artifactId>helloword</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<!-- 添加servlet-api,jsp-api -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<!-- 配置了很多插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
運作
首先在servlet中寫測試内容
通路
Idea中使用maven
建立maven項目
至于idea中如何使用maveni指令 如圖
maven的其他知識點
pom.xml檔案詳解
<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.0http://maven.apache.org/maven-v4_0_0.xsd">
<!--父項目的坐标。如果項目中沒有規定某個元素的值,那麼父項目中的對應值即為項目的預設值。 坐标包括group ID,artifact ID和 version。-->
<parent>
<!--被繼承的父項目的構件辨別符-->
<artifactId/>
<!--被繼承的父項目的全球唯一辨別符-->
<groupId/>
<!--被繼承的父項目的版本-->
<version/>
<!-- 父項目的pom.xml檔案的相對路徑。相對路徑允許你選擇一個不同的路徑。預設值是../pom.xml。Maven首先在建構目前項目的地方尋找父項 目的pom,其次在檔案系統的這個位置(relativePath位置),然後在本地倉庫,最後在遠端倉庫尋找父項目的pom。-->
<relativePath/>
</parent>
<!--聲明項目描述符遵循哪一個POM模型版本。模型本身的版本很少改變,雖然如此,但它仍然是必不可少的,這是為了當Maven引入了新的特性或者其他模型變更的時候,確定穩定性。-->
<modelVersion>4.0.0</modelVersion>
<!--項目的全球唯一辨別符,通常使用全限定的包名區分該項目和其他項目。并且建構時生成的路徑也是由此生成, 如com.mycompany.app生成的相對路徑為:/com/mycompany/app-->
<groupId>asia.banseon</groupId>
<!-- 構件的辨別符,它和group ID一起唯一辨別一個構件。換句話說,你不能有兩個不同的項目擁有同樣的artifact ID和groupID;在某個 特定的group ID下,artifact ID也必須是唯一的。構件是項目産生的或使用的一個東西,Maven為項目産生的構件包括:JARs,源 碼,二進制釋出和WARs等。-->
<artifactId>banseon-maven2</artifactId>
<!--項目産生的構件類型,例如jar、war、ear、pom。插件可以建立他們自己的構件類型,是以前面列的不是全部構件類型-->
<packaging>jar</packaging>
<!--項目目前版本,格式為:主版本.次版本.增量版本-限定版本号-->
<version>1.0-SNAPSHOT</version>
<!--項目的名稱, Maven産生的文檔用-->
<name>banseon-maven</name>
<!--項目首頁的URL, Maven産生的文檔用-->
<url>http://www.baidu.com/banseon</url>
<!-- 項目的較長的描述, Maven 産生的文檔用。 當這個元素能夠用HTML格式描述時(例如,CDATA中的文本會被解析器忽略,就可以包含HTML标 簽), 不鼓勵使用純文字描述。如果你需要修改産生的web站點的索引頁面,你應該修改你自己的索引頁檔案,而不是調整這裡的文檔。-->
<description>A maven project to study maven.</description>
<!--描述了這個項目建構環境中的前提條件。-->
<prerequisites>
<!--建構該項目或使用該插件所需要的Maven的最低版本-->
<maven/>
</prerequisites>
<!--項目的問題管理系統(Bugzilla, Jira, Scarab,或任何你喜歡的問題管理系統)的名稱和URL,本例為 jira-->
<issueManagement>
<!--問題管理系統(例如jira)的名字,-->
<system>jira</system>
<!--該項目使用的問題管理系統的URL-->
<url>http://jira.baidu.com/banseon</url>
</issueManagement>
<!--項目持續內建資訊-->
<ciManagement>
<!--持續內建系統的名字,例如continuum-->
<system/>
<!--該項目使用的持續內建系統的URL(如果持續內建系統有web接口的話)。-->
<url/>
<!--建構完成時,需要通知的開發者/使用者的配置項。包括被通知者資訊和通知條件(錯誤,失敗,成功,警告)-->
<notifiers>
<!--配置一種方式,當建構中斷時,以該方式通知使用者/開發者-->
<notifier>
<!--傳送通知的途徑-->
<type/>
<!--發生錯誤時是否通知-->
<sendOnError/>
<!--建構失敗時是否通知-->
<sendOnFailure/>
<!--建構成功時是否通知-->
<sendOnSuccess/>
<!--發生警告時是否通知-->
<sendOnWarning/>
<!--不贊成使用。通知發送到哪裡-->
<address/>
<!--擴充配置項-->
<configuration/>
</notifier>
</notifiers>
</ciManagement>
<!--項目建立年份,4位數字。當産生版權資訊時需要使用這個值。-->
<inceptionYear/>
<!--項目相關郵件清單資訊-->
<mailingLists>
<!--該元素描述了項目相關的所有郵件清單。自動産生的網站引用這些資訊。-->
<mailingList>
<!--郵件的名稱-->
<name>Demo</name>
<!--發送郵件的位址或連結,如果是郵件位址,建立文檔時,mailto: 連結會被自動建立-->
<post>[email protected]</post>
<!--訂閱郵件的位址或連結,如果是郵件位址,建立文檔時,mailto: 連結會被自動建立-->
<subscribe>[email protected]</subscribe>
<!--取消訂閱郵件的位址或連結,如果是郵件位址,建立文檔時,mailto: 連結會被自動建立-->
<unsubscribe>[email protected]</unsubscribe>
<!--你可以浏覽郵件資訊的URL-->
<archive>http:/hi.baidu.com/banseon/demo/dev/</archive>
</mailingList>
</mailingLists>
<!--項目開發者清單-->
<developers>
<!--某個項目開發者的資訊-->
<developer>
<!--SCM裡項目開發者的唯一辨別符-->
<id>HELLO WORLD</id>
<!--項目開發者的全名-->
<name>banseon</name>
<!--項目開發者的email-->
<email>[email protected]</email>
<!--項目開發者的首頁的URL-->
<url/>
<!--項目開發者在項目中扮演的角色,角色元素描述了各種角色-->
<roles>
<role>Project Manager</role>
<role>Architect</role>
</roles>
<!--項目開發者所屬組織-->
<organization>demo</organization>
<!--項目開發者所屬組織的URL-->
<organizationUrl>http://hi.baidu.com/banseon</organizationUrl>
<!--項目開發者屬性,如即時消息如何處理等-->
<properties>
<dept>No</dept>
</properties>
<!--項目開發者所在時區, -11到12範圍内的整數。-->
<timezone>-5</timezone>
</developer>
</developers>
<!--項目的其他貢獻者清單-->
<contributors>
<!--項目的其他貢獻者。參見developers/developer元素-->
<contributor>
<name/><email/><url/><organization/><organizationUrl/><roles/><timezone/><properties/>
</contributor>
</contributors>
<!--該元素描述了項目所有License清單。 應該隻列出該項目的license清單,不要列出依賴項目的 license清單。如果列出多個license,使用者可以選擇它們中的一個而不是接受所有license。-->
<licenses>
<!--描述了項目的license,用于生成項目的web站點的license頁面,其他一些報表和validation也會用到該元素。-->
<license>
<!--license用于法律上的名稱-->
<name>Apache 2</name>
<!--官方的license正文頁面的URL-->
<url>http://www.baidu.com/banseon/LICENSE-2.0.txt</url>
<!--項目分發的主要方式:
repo,可以從Maven庫下載下傳
manual, 使用者必須手動下載下傳和安裝依賴-->
<distribution>repo</distribution>
<!--關于license的補充資訊-->
<comments>A business-friendly OSS license</comments>
</license>
</licenses>
<!--SCM(Source Control Management)标簽允許你配置你的代碼庫,供Maven web站點和其它插件使用。-->
<scm>
<!--SCM的URL,該URL描述了版本庫和如何連接配接到版本庫。欲知詳情,請看SCMs提供的URL格式和清單。該連接配接隻讀。-->
<connection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
</connection>
<!--給開發者使用的,類似connection元素。即該連接配接不僅僅隻讀-->
<developerConnection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
</developerConnection>
<!--目前代碼的标簽,在開發階段預設為HEAD-->
<tag/>
<!--指向項目的可浏覽SCM庫(例如ViewVC或者Fisheye)的URL。-->
<url>http://svn.baidu.com/banseon</url>
</scm>
<!--描述項目所屬組織的各種屬性。Maven産生的文檔用-->
<organization>
<!--組織的全名-->
<name>demo</name>
<!--組織首頁的URL-->
<url>http://www.baidu.com/banseon</url>
</organization>
<!--建構項目需要的資訊-->
<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>
<!--在列的項目建構profile,如果被激活,會修改建構處理-->
<profiles>
<!--根據環境參數或指令行參數激活某個建構處理-->
<profile>
<!--建構配置的唯一辨別符。即用于指令行激活,也用于在繼承時合并具有相同辨別符的profile。-->
<id/>
<!--自動觸發profile的條件邏輯。Activation是profile的開啟鑰匙。profile的力量來自于它
能夠在某些特定的環境中自動使用某些特定的值;這些環境通過activation元素指定。activation元素并不是激活profile的唯一方式。-->
<activation>
<!--profile預設是否激活的标志-->
<activeByDefault/>
<!--當比對的jdk被檢測到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4開頭的JDK。-->
<jdk/>
<!--當比對的作業系統屬性被檢測到,profile被激活。os元素可以定義一些作業系統相關的屬性。-->
<os>
<!--激活profile的作業系統的名字-->
<name>Windows XP</name>
<!--激活profile的作業系統所屬家族(如 'windows')-->
<family>Windows</family>
<!--激活profile的作業系統體系結構 -->
<arch>x86</arch>
<!--激活profile的作業系統版本-->
<version>5.1.2600</version>
</os>
<!--如果Maven檢測到某一個屬性(其值可以在POM中通過${名稱}引用),其擁有對應的名稱和值,Profile就會被激活。如果值
字段是空的,那麼存在屬性名稱字段就會激活profile,否則按區分大小寫方式比對屬性值字段-->
<property>
<!--激活profile的屬性的名稱-->
<name>mavenVersion</name>
<!--激活profile的屬性的值-->
<value>2.0.3</value>
</property>
<!--提供一個檔案名,通過檢測該檔案的存在或不存在來激活profile。missing檢查檔案是否存在,如果不存在則激活
profile。另一方面,exists則會檢查檔案是否存在,如果存在則激活profile。-->
<file>
<!--如果指定的檔案存在,則激活profile。-->
<exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</exists>
<!--如果指定的檔案不存在,則激活profile。-->
<missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</missing>
</file>
</activation>
<!--建構項目所需要的資訊。參見build元素-->
<build>
<defaultGoal/>
<resources>
<resource>
<targetPath/><filtering/><directory/><includes/><excludes/>
</resource>
</resources>
<testResources>
<testResource>
<targetPath/><filtering/><directory/><includes/><excludes/>
</testResource>
</testResources>
<directory/><finalName/><filters/>
<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>
</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>
<!--子產品(有時稱作子項目) 被建構成項目的一部分。列出的每個子產品元素是指向該子產品的目錄的相對路徑-->
<modules/>
<!--發現依賴和擴充的遠端倉庫清單。-->
<repositories>
<!--參見repositories/repository元素-->
<repository>
<releases>
<enabled/><updatePolicy/><checksumPolicy/>
</releases>
<snapshots>
<enabled/><updatePolicy/><checksumPolicy/>
</snapshots>
<id/><name/><url/><layout/>
</repository>
</repositories>
<!--發現插件的遠端倉庫清單,這些插件用于建構和報表-->
<pluginRepositories>
<!--包含需要連接配接到遠端插件倉庫的資訊.參見repositories/repository元素-->
<pluginRepository>
<releases>
<enabled/><updatePolicy/><checksumPolicy/>
</releases>
<snapshots>
<enabled/><updatePolicy/><checksumPolicy/>
</snapshots>
<id/><name/><url/><layout/>
</pluginRepository>
</pluginRepositories>
<!--該元素描述了項目相關的所有依賴。 這些依賴組成了項目建構過程中的一個個環節。它們自動從項目定義的倉庫中下載下傳。要擷取更多資訊,請看項目依賴機制。-->
<dependencies>
<!--參見dependencies/dependency元素-->
<dependency>
......
</dependency>
</dependencies>
<!--不贊成使用. 現在Maven忽略該元素.-->
<reports/>
<!--該元素包括使用報表插件産生報表的規範。當使用者執行“mvn site”,這些報表就會運作。 在頁面導航欄能看到所有報表的連結。參見reporting元素-->
<reporting>
......
</reporting>
<!--參見dependencyManagement元素-->
<dependencyManagement>
<dependencies>
<!--參見dependencies/dependency元素-->
<dependency>
......
</dependency>
</dependencies>
</dependencyManagement>
<!--參見distributionManagement元素-->
<distributionManagement>
......
</distributionManagement>
<!--參見properties元素-->
<properties/>
</profile>
</profiles>
<!--子產品(有時稱作子項目) 被建構成項目的一部分。列出的每個子產品元素是指向該子產品的目錄的相對路徑-->
<modules/>
<!--發現依賴和擴充的遠端倉庫清單。-->
<repositories>
<!--包含需要連接配接到遠端倉庫的資訊-->
<repository>
<!--如何處理遠端倉庫裡釋出版本的下載下傳-->
<releases>
<!--true或者false表示該倉庫是否為下載下傳某種類型構件(釋出版,快照版)開啟。 -->
<enabled/>
<!--該元素指定更新發生的頻率。Maven會比較本地POM和遠端POM的時間戳。這裡的選項是:always(一直),daily(預設,每日),interval:X(這裡X是以分鐘為機關的時間間隔),或者never(從不)。-->
<updatePolicy/>
<!--當Maven驗證構件校驗檔案失敗時該怎麼做:ignore(忽略),fail(失敗),或者warn(警告)。-->
<checksumPolicy/>
</releases>
<!-- 如何處理遠端倉庫裡快照版本的下載下傳。有了releases和snapshots這兩組配置,POM就可以在每個單獨的倉庫中,為每種類型的構件采取不同的 政策。例如,可能有人會決定隻為開發目的開啟對快照版本下載下傳的支援。參見repositories/repository/releases元素 -->
<snapshots>
<enabled/><updatePolicy/><checksumPolicy/>
</snapshots>
<!--遠端倉庫唯一辨別符。可以用來比對在settings.xml檔案裡配置的遠端倉庫-->
<id>banseon-repository-proxy</id>
<!--遠端倉庫名稱-->
<name>banseon-repository-proxy</name>
<!--遠端倉庫URL,按protocol://hostname/path形式-->
<url>http://192.168.1.169:9999/repository/</url>
<!-- 用于定位和排序構件的倉庫布局類型-可以是default(預設)或者legacy(遺留)。Maven 2為其倉庫提供了一個預設的布局;然 而,Maven 1.x有一種不同的布局。我們可以使用該元素指定布局是default(預設)還是legacy(遺留)。-->
<layout>default</layout>
</repository>
</repositories>
<!--發現插件的遠端倉庫清單,這些插件用于建構和報表-->
<pluginRepositories>
<!--包含需要連接配接到遠端插件倉庫的資訊.參見repositories/repository元素-->
<pluginRepository>
......
</pluginRepository>
</pluginRepositories>
<!--該元素描述了項目相關的所有依賴。 這些依賴組成了項目建構過程中的一個個環節。它們自動從項目定義的倉庫中下載下傳。要擷取更多資訊,請看項目依賴機制。-->
<dependencies>
<dependency>
<!--依賴的group ID-->
<groupId>org.apache.maven</groupId>
<!--依賴的artifact ID-->
<artifactId>maven-artifact</artifactId>
<!--依賴的版本号。 在Maven 2裡, 也可以配置成版本号的範圍。-->
<version>3.8.1</version>
<!-- 依賴類型,預設類型是jar。它通常表示依賴的檔案的擴充名,但也有例外。一個類型可以被映射成另外一個擴充名或分類器。類型經常和使用的打包方式對應, 盡管這也有例外。一些類型的例子:jar,war,ejb-client和test-jar。如果設定extensions為 true,就可以在 plugin裡定義新的類型。是以前面的類型的例子不完整。-->
<type>jar</type>
<!-- 依賴的分類器。分類器可以區分屬于同一個POM,但不同建構方式的構件。分類器名被附加到檔案名的版本号後面。例如,如果你想要建構兩個單獨的構件成 JAR,一個使用Java 1.4編譯器,另一個使用Java 6編譯器,你就可以使用分類器來生成兩個單獨的JAR構件。-->
<classifier></classifier>
<!--依賴範圍。在項目釋出過程中,幫助決定哪些構件被包括進來。欲知詳情請參考依賴機制。
- compile :預設範圍,用于編譯
- provided:類似于編譯,但支援你期待jdk或者容器提供,類似于classpath
- runtime: 在執行時需要使用
- test: 用于test任務時使用
- system: 需要外在提供相應的元素。通過systemPath來取得
- systemPath: 僅用于範圍為system。提供相應的路徑
- optional: 當項目自身被依賴時,标注依賴是否傳遞。用于連續依賴時使用-->
<scope>test</scope>
<!--僅供system範圍使用。注意,不鼓勵使用這個元素,并且在新的版本中該元素可能被覆寫掉。該元素為依賴規定了檔案系統上的路徑。需要絕對路徑而不是相對路徑。推薦使用屬性比對絕對路徑,例如${java.home}。-->
<systemPath></systemPath>
<!--當計算傳遞依賴時, 從依賴構件清單裡,列出被排除的依賴構件集。即告訴maven你隻依賴指定的項目,不依賴項目的依賴。此元素主要用于解決版本沖突問題-->
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
<!--可選依賴,如果你在項目B中把C依賴聲明為可選,你就需要在依賴于B的項目(例如項目A)中顯式的引用對C的依賴。可選依賴阻斷依賴的傳遞性。-->
<optional>true</optional>
</dependency>
</dependencies>
<!--不贊成使用. 現在Maven忽略該元素.-->
<reports></reports>
<!--該元素描述使用報表插件産生報表的規範。當使用者執行“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>
<!-- 繼承自該項目的所有子項目的預設依賴資訊。這部分的依賴資訊不會被立即解析,而是當子項目聲明一個依賴(必須描述group ID和 artifact ID資訊),如果group ID和artifact ID以外的一些資訊沒有描述,則通過group ID和artifact ID 比對到這裡的依賴,并使用這裡的依賴資訊。-->
<dependencyManagement>
<dependencies>
<!--參見dependencies/dependency元素-->
<dependency>
......
</dependency>
</dependencies>
</dependencyManagement>
<!--項目分發資訊,在執行mvn deploy後表示要釋出的位置。有了這些資訊就可以把網站部署到遠端伺服器或者把構件部署到遠端倉庫。-->
<distributionManagement>
<!--部署項目産生的構件到遠端倉庫需要的資訊-->
<repository>
<!--是配置設定給快照一個唯一的版本号(由時間戳和建構流水号)?還是每次都使用相同的版本号?參見repositories/repository元素-->
<uniqueVersion/>
<id>banseon-maven2</id>
<name>banseon maven2</name>
<url>file://${basedir}/target/deploy</url>
<layout/>
</repository>
<!--構件的快照部署到哪裡?如果沒有配置該元素,預設部署到repository元素配置的倉庫,參見distributionManagement/repository元素-->
<snapshotRepository>
<uniqueVersion/>
<id>banseon-maven2</id>
<name>Banseon-maven2 Snapshot Repository</name>
<url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshot</url>
<layout/>
</snapshotRepository>
<!--部署項目的網站需要的資訊-->
<site>
<!--部署位置的唯一辨別符,用來比對站點和settings.xml檔案裡的配置-->
<id>banseon-site</id>
<!--部署位置的名稱-->
<name>business api website</name>
<!--部署位置的URL,按protocol://hostname/path形式-->
<url>
scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web
</url>
</site>
<!--項目下載下傳頁面的URL。如果沒有該元素,使用者應該參考首頁。使用該元素的原因是:幫助定位那些不在倉庫裡的構件(由于license限制)。-->
<downloadUrl/>
<!--如果構件有了新的group ID和artifact ID(構件移到了新的位置),這裡列出構件的重定位資訊。-->
<relocation>
<!--構件新的group ID-->
<groupId/>
<!--構件新的artifact ID-->
<artifactId/>
<!--構件新的版本号-->
<version/>
<!--顯示給使用者的,關于移動的額外資訊,例如原因。-->
<message/>
</relocation>
<!-- 給出該構件在遠端倉庫的狀态。不得在本地項目中設定該元素,因為這是工具自動更新的。有效的值有:none(預設),converted(倉庫管理者從 Maven 1 POM轉換過來),partner(直接從夥伴Maven 2倉庫同步過來),deployed(從Maven 2執行個體部 署),verified(被核實時正确的和最終的)。-->
<status/>
</distributionManagement>
<!--以值替代名稱,Properties可以在整個POM中使用,也可以作為觸發條件(見settings.xml配置檔案裡activation元素的說明)。格式是<name>value</name>。-->
<properties/>
</project>
安裝指定的位置的jar到本地倉庫指令
--安裝第三方jar包到本地倉庫
----進入jar包所在目錄運作
mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dfile=fastjson-1.1.37.jar -Dpackaging=jar
----打開cmd直接運作
mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=C:\my_java\授課資料\資料:maven【進階】\安裝第三方jar包\fastjson-1.1.37.jar
--安裝第三方jar包到私服
--在settings配置檔案中添加登入私服第三方登入資訊
<server>
<id>thirdparty</id>
<username>admin</username>
<password>admin123</password>
</server>
----進入jar包所在目錄運作
mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=fastjson-1.1.37.jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty
----打開cmd直接運作
mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=C:\my_java\授課資料\資料:maven【進階】\安裝第三方jar包\fastjson-1.1.37.jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty
pom中導入maven插件和jdk插件
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- 資源檔案拷貝插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- java編譯插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
Maven中的dependencyManagement 以及dependencies意義
1、在聚合工程中的父工程才會使用dependencyManagement,對jar版本申明管理
2、繼承這個父工程之後所有的子項目可以不寫version和scope,會從dependencyManagement繼承,如果寫了不會繼承
3、dependencyManagement隻是做版本管理 不會實際引入jar
plugins和pluginManagement的差別概述
plugins 和 pluginManagement 的差別,和我們前面研究過的 dependencies 和 dependencyManagement 的差別是非常類似的。plugins 下的 plugin 是真實使用的,而 pluginManagement 下的 plugins 下的 plugin 則僅僅是一種聲明,子項目中可以對 pluginManagement 下的 plugin 進行資訊的選擇、繼承、覆寫等。
pluginManagement使用實戰
假如存在兩個項目,項目A為項目B的父項目,其關系通過pom檔案的關系确定。項目A的父pom檔案片段如下:
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
如果項目B也想使用該plugin配置,則在項目B的子pom檔案中隻需要如下配置:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
</plugin>
</plugins>
我們可以看到,子pom檔案中,省去了版本、配置細節等資訊,隻需要指定groupId和artifactId,其他資訊均從父pom檔案繼承。當然,如果子pom檔案想定制自己的特定内容,可以另行設定,并會覆寫從父pom檔案繼承到的内容。
但是在父pom中,如果使用這個标簽來包裹plugins插件,當在此項目根目錄運作對應的mvn指令時,如果在子pom中沒有直接像上面再次引用這個plugin,那麼不會觸發這個plugin插件,隻有在子pom中再次引用了之後,才會在對應的子項目路徑下觸發這個plugin.
需要注意的是,dependencies 和 dependencyManagement 均是 project 下的直接子元素,但是 plugins 和 pluginManagement 卻是 project 下 build 的直接子元素。