1. 程式人生 > >maven入門(轉載老師講義,博主只圖檢視方便)

maven入門(轉載老師講義,博主只圖檢視方便)

一、Maven介紹

Maven專案物件模型(POM),可以通過一小段描述資訊來管理專案的構建,報告和文件的軟體專案管理工具

Maven 除了以程式構建能力為特色之外,還提供高階專案管理工具。由於 Maven 的預設構建規則有較高的可重用性,所以常常用兩三行 Maven 構建指令碼就可以構建簡單的專案。由於 Maven 的面向專案的方法,許多 Apache Jakarta 專案發文時使用 Maven,而且公司專案採用 Maven 的比例在持續增長。

Maven這個單詞來自於意第緒語(猶太語),意為知識的積累,最初在Jakata Turbine專案中用來簡化構建過程。當時有一些專案(有各自Ant build檔案),僅有細微的差別,而JAR檔案都由

CVS來維護。於是希望有一種標準化的方式構建專案,一個清晰的方式定義專案的組成,一個容易的方式釋出專案的資訊,以及一種簡單的方式在多個專案中共享JARs。

二、Maven安裝

前面對maven已經有了一個大致的瞭解了,接下來要使用,如何在機器上安裝maven呢,這裡我們以windows系統為例來講解安裝步驟,其他系統的安裝,百度一下。

1準備:首先,我們需要下載 maven 軟體(http://maven.apache.org/download.cgi

 

             接下來,準備安裝,maven 是一個免安裝版的軟體,所謂的免安裝版,是指無需向安裝 “騰訊QQ”那樣根據安裝嚮導,一步一步的點選。我們只需要把 maven的壓縮包檔案解壓到指定的位置即可。為了避免誤刪除,請不要把它直接解壓到桌面,良好的軟體管理和歸檔也是一項技能。另外,maven 軟體依賴於 java執行環境,所以先要檢查機器上是否已經安裝了Java環境,這裡一定要注意,需要配置JAVA_HOME 環境變數,maven啟動時會去查詢這個環境變數,若果沒有則無法啟動。 

2安裝:解壓安裝包到指定位置

             ![1535278006451](C:\Users\ADMINI~1\AppData\Local\Temp\1535278006451.png)

目錄解釋:

    bin: 存放mavn 執行的指令碼命令。Windows系統下使用*.bat
   
    boot:啟動mavn的工具,和maven 自身提供的類載入器
   
    conf:存放maven配置檔案,如settingx.xml
   
    lib:存放 maven 執行時需要的 Java類庫。        

3安裝:配置環境變數

1、新建JAVA_HOME 環境變數(如果之前配置過,跳過這一步)

2、新建 M2_HOME 環境變數

3、編輯 path 環境變數

 

4測試:

 

三、第一個Maven程式

1認識Pom檔案

     Pom(Project Object Model) 專案工程物件模型,是Maven的核心概念,Pom是一個xml檔案,Maven工具就是依靠此檔案來,構建工程的。以下是一個簡單的 pom 檔案的示例
<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.xingxue</groupId>         <!-- 公司的域名倒寫-->
      <artifactId>maven-demo</artifactId>    <!-- 產品名稱|工程名稱-->
      <version>1.0-SNAPSHOT</version>        <!-- 版本號-->
      <!-- 打包方式 -->
      <packaging>jar</packaging>
      <!--生成的包名稱:artifactId+version+packaging -->
    
       <!-- 可選資訊 -->
      <name>FristApp</name>
      <url>http://maven.apache.org</url>
       
      <!-- 依賴管理標籤 -->
      <dependencies>
        <!-- 具體依賴 ---> 
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
      </dependencies>
</project>

Maven 座標:描述一個軟體的位置資訊的手段

  <groupId>com.xingxue</groupId>
  <artifactId>maven-demo</artifactId>
  <version>1.0-SNAPSHOT</version>

理解:

 

2編寫程式碼

maven 工程目錄規範:

標準目錄結構:

src/main/java application library sources - java原始碼檔案
src/main/resources application library resources - 資源庫,會自動複製到classes資料夾下
src/main/filters resources filter files - 資源過濾檔案
src/main/assembly assembly descriptor - 元件的描述配置,如何打包
src/main/config configuration files - 配置檔案
src/main/webapp web application sources - web應用的目錄,WEB-INF,js,css等
src/main/bin 指令碼庫
src/test/java 單元測試java原始碼檔案
src/test/resources 測試需要的資源庫
src/test/filters 測試資源過濾庫
src/site 一些文件
target/ 存放專案構建後的檔案和目錄,jar包,war包,編譯的class檔案等;Maven構建時生成的
pom.xml 工程描述檔案
LICENSE.txt license
README.txt read me
package com.xingxue.domain;
public class Student{
    
    private String name;
    private int age;
    
    public Student(String name,int age){
        this.name=name;
        this.age=age;
    }
    public void sayHello(){
        System.out.println("大家好!我是"+name+"今年"+age+"歲了");
    }
}
import org.junit.Test;
import com.xingxue.domain.Student;
public class AppTest{
    
    @Test
    public void test(){
        Student st = new Student("aaa",10);
        st.sayHello();
    }
}

3測試 > mvn test

Maven常用命令

mvn --version(mvn -v):顯示版本號,Maven home,Java 版本,java home,作業系統,編碼等

mvn compile :編譯原始碼

mvn test-compile :編譯測試程式碼

mvn test : 執行應用程式中的單元測試

mvn site : 生成專案相關資訊的網站

mvn clean :清除目標目錄中的生成結果

mvn package : 依據專案生成 jar 檔案

mvn package -Dmaven.test.skip=ture 打包時跳過測試

                   生成包名稱為: 

mvn install :在本地 Repository 中安裝 jar

四、使用專案骨架

手動建立專案比較麻煩,各種建立檔案,可以使用一個專案模板來建立一個專案(這個模板就是骨架)在maven 中使用  mvn archetype:generate 命令根據提示嚮導建立專案

 

7 是一個 maven官方提供的 java普通工程的骨架

10 是一個 maven官方提供的 javaweb 工程的骨架

 

五、Maven生命週期

Maven有以下三種標準的生命週期:

  • clean

  • default(或 build)

  • site

1、clean生命週期:

  • pre-clean

  • clean

  • post-clean

 

2、預設生命週期:

生命週期階段 描述
validate 驗證專案是否正確,並且所有必要的資訊可用於完成構建過程
initialize 建立初始化狀態,例如設定屬性
generate-sources 產生任何的原始碼包含在編譯階段
process-sources 處理原始碼,例如,過濾器值
generate-resources 包含在包中產生的資源
process-resources 複製和處理資源到目標目錄,準備打包階段
compile 編譯該專案的原始碼
process-classes 從編譯生成的檔案提交處理,例如:Java類的位元組碼增強/優化
generate-test-sources 生成任何測試的原始碼包含在編譯階段
process-test-sources 處理測試原始碼,例如,過濾器任何值
test-compile 編譯測試原始碼到測試目標目錄
process-test-classes 處理測試程式碼檔案編譯生成的檔案
test 執行測試使用合適的單元測試框架(JUnit)
prepare-package 執行必要的任何操作的實際打包之前準備一個包
package 提取編譯後的程式碼,並在其分發格式打包,如JAR,WAR或EAR檔案
pre-integration-test 完成執行整合測試之前所需操作。例如,設定所需的環境
integration-test 處理並在必要時部署軟體包到整合測試可以執行的環境
pre-integration-test 完成整合測試已全部執行後所需操作。例如,清理環境
verify 執行任何檢查,驗證包是有效的,符合質量稽核規定
install 將包安裝到本地儲存庫,它可以用作當地其他專案的依賴
deploy 複製最終的包到遠端倉庫與其他開發者和專案共享

3、site生命週期

  • pre-site

  • site

  • post-site

  • site-deploy

從命令列執行Maven任務的最主要的方式就是呼叫Maven的生命週期階段,需要注意的是,各個生命週期階段是相互獨立的,而一個生命週期的階段是有前後依賴關係的。比如 mvn clean 該命令呼叫了clean生命週期的 的clean階段 但是實際執行的只有 pre-clean 和 clean 階段。

六、Maven倉庫

maven倉庫就是存放jar包的地方

1、為什麼需要倉庫?

2、倉庫在哪裡?

倉庫型別 * 根據倉庫位置的不同,倉庫的型別也不相同

  • 本地倉庫 -- 在自己電腦上的倉庫

  • 遠端倉庫(私服) -- 在區域網內的倉庫

  • 中央倉庫 -- 網路上的倉庫(是由apache團隊下的maven團隊維護的倉庫,包括了全球基本上所有的jar包)

    <http://repo1.maven.org/maven2/>

配置本地倉庫:開啟setitng.xml

    <!-- localRepository
    | The path to the local repository maven will use to store artifacts.
    |
    | Default: ${user.home}/.m2/repository
    -->
    <localRepository>F:\repo</localRepository>

如果不配置,則通常預設為 C:\Users\Administrator.m2\repository 在c盤中。

配置中央倉庫:

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>*</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

中央倉庫為境外網站,速度比較慢,國內多用阿里的映象速度還可以

注意:當在專案中宣告依賴時,maven會先到本地倉庫中去查詢,本地倉庫沒有,才會去中央倉庫下載。

 

七、依賴管理

 <dependencies>
         
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
​
  </dependencies>

Maven 除了構建專案的作用以外的另一個強大功能就是管理依賴,回想沒有maven工具時,開發一個專案,我們需要去各個網站上去下載各種jar包,然後拷到專案中

使用maven再也不需要東拼西湊下載jar包了,開發者只需要在pom檔案中宣告需要的依賴,maven 自動到maven倉庫中去下載,同時,還能分析依賴關係。

依賴範圍

Scope 描述  
compile 這個範圍表明依賴可用專案的類路徑中。這是預設的範圍。 spring-xx
provided 這表明依賴範圍提供的JDK或伺服器/容器在執行時。 servlet-api
runtime 這個範圍表明,依賴不需要編譯,但在執行期間是必需的。 mysql-connector-5.1.jar
test 這個範圍表明,依賴只是用於測試編譯和執行階段。 junit
system 這表明你必須提供範圍系統路徑。  
import 這個範圍時才使用的型別是pom的依賴。<br />這個範圍表明,POM應該替換為指定依賴項POM的< dependencyManagement >部分。  

Maven官方 依賴查詢網站:http://mvnrepository.com/

依賴傳遞

 

當專案中引入hibernate-core 時,該依賴又依賴於 slf4j-api ,這時slf4j就是hibernate-core 的傳遞依賴。傳遞依賴的作用域是通過 第一和 第二直接依賴決定的如下表格:

 

第一直接依賴\第二直接依賴 compile test provided runtime
compile compile - - runtime
test test - - test
provided provided - provided provided
runtime runtime - - runtime

規律:

       當第二依賴為 compile 傳遞依賴 和第一直接依賴範圍一致。
       當第二依賴為 test 依賴不傳遞。
   
       當第二依賴為 provided 只有 當第一直接依賴為也為provided時發生,且為provided。
   
       當第二依賴為 runtime  (除compile)傳遞依賴於第一依賴相同。

依賴原則

Maven引入的傳遞依賴機制,一方面大大簡化和方便了依賴宣告,另一方面,大部分情況下我們只需要關心專案的直接依賴是什麼,而不用考慮這些直接依賴會引入什麼傳遞性依賴。但有時候,當傳遞依賴出現問題的時候,我們就需要清楚的知道該傳遞性依賴是從那條路徑引入的。

例如,專案A有 如下依賴關係: A- > B -> C -> X(1.0) , A -> D -> X(2.0) maven 用哪個?

       專案B有 如下依賴關係: A- > B -> Y(1.0)  ,   A -> C -> Y(2.0)        maven用哪個?

這時候就需要了解Maven的依賴原則

  • 第一原則:路徑最近優先

  • 第二原則:第一宣告優先

八、IDE整合Maven

  • Eclipse 整合 Maven (百度)

  • Idea 整合 Maven(百度)

 

九、Maven外掛

一、概述

我們都知道Maven本質上是一個外掛框架,它的核心並不執行任何具體的構建任務,所有這些任務都交給外掛來完成。

例如編譯原始碼是由maven-compiler-plugin完成的。

進一步說,每個任務對應了一個外掛目標(goal),每個外掛會有一個或者多個目標。

例如maven-compiler-plugin的compile目標用來編譯位於src/main/java/目錄下的主原始碼,testCompile目標用來編譯位於src/test/java/目錄下的測試原始碼。

二、執行

使用者可以通過兩種方式呼叫Maven外掛目標。

第一種方式是將外掛目標與生命週期階段(lifecycle phase)繫結,這樣使用者在命令列只是輸入生命週期階段而已。

例如Maven預設將maven-compiler-plugin的compile目標與compile生命週期階段繫結,因此命令mvn compile實際上是先定位到compile這一生命週期階段,然後再根據繫結關係調用maven-compiler-plugin的compile目標。

第二種方式是直接在命令列指定要執行的外掛目標。

例如mvn archetype:generate 就表示呼叫maven-archetype-plugin的generate目標,這種帶冒號的呼叫方式與生命週期無關。

三、外掛庫

認識上述Maven外掛的基本概念能幫助你理解Maven的工作機制,不過要想更高效率地使用Maven,瞭解一些常用的外掛還是很有必要的,這可以幫助你避免一不小心重新發明輪子。

多年來Maven社群積累了大量的經驗,並隨之形成了一個成熟的外掛生態圈。

Maven官方有兩個外掛列表:

第一個列表的GroupId為org.apache.maven.plugins,這裡的外掛最為成熟,具體地址為:http://maven.apache.org/plugins/index.html

第二個列表的GroupId為org.codehaus.mojo,這裡的外掛沒有那麼核心,但也有不少十分有用,其地址為:http://mojo.codehaus.org/plugins.html

四、外掛介紹

maven-antrun-plugin

http://maven.apache.org/plugins/maven-antrun-plugin/

maven-antrun-plugin能讓使用者在Maven專案中執行Ant任務。使用者可以直接在該外掛的配置以Ant的方式編寫Target,然後交給該外掛的run目標去執行。

在一些由Ant往Maven遷移的專案中,該外掛尤其有用。

此外當你發現需要編寫一些自定義程度很高的任務,同時又覺得Maven不夠靈活時,也可以以Ant的方式實現之。maven-antrun-plugin的run目標通常與生命週期繫結執行。

maven-archetype-plugin

http://maven.apache.org/archetype/maven-archetype-plugin/

Archtype指專案的骨架,Maven初學者最開始執行的Maven命令可能就是mvn archetype:generate,這實際上就是讓maven-archetype-plugin生成一個很簡單的專案骨架,幫助開發者快速上手。

可能也有人看到一些文件寫了mvn archetype:create,但實際上create目標已經被棄用了,取而代之的是generate目標,該目標使用互動式的方式提示使用者輸入必要的資訊以建立專案,體驗更好。

maven-archetype-plugin還有一些其他目標幫助使用者自己定義專案原型,例如你由一個產品需要交付給很多客戶進行二次開發,你就可以為他們提供一個Archtype,幫助他們快速上手。

maven-assembly-plugin

http://maven.apache.org/plugins/maven-assembly-plugin/

maven-assembly-plugin的用途是製作專案分發包,該分發包可能包含了專案的可執行檔案、原始碼、readme、平臺指令碼等等。

maven-assembly-plugin支援各種主流的格式如zip、tar.gz、jar和war等,具體打包哪些檔案是高度可控的。

例如使用者可以按檔案級別的粒度、檔案集級別的粒度、模組級別的粒度、以及依賴級別的粒度控制打包,此外,包含和排除配置也是支援的。

maven-assembly-plugin要求使用者使用一個名為assembly.xml的元資料檔案來表述打包,它的single目標可以直接在命令列呼叫,也可以被繫結至生命週期。

maven-dependency-plugin

http://maven.apache.org/plugins/maven-dependency-plugin/

maven-dependency-plugin最大的用途是幫助分析專案依賴

dependency:list能夠列出專案最終解析到的依賴列表

dependency:tree能進一步的描繪專案依賴樹

dependency:analyze可以告訴你專案依賴潛在的問題

如果你有直接使用到的卻未宣告的依賴,該目標就會發出警告。

maven-dependency-plugin還有很多目標幫助你操作依賴檔案,例如dependency:copy-dependencies能將專案依賴從本地Maven倉庫複製到某個特定的資料夾下面。

maven-enforcer-plugin

http://maven.apache.org/plugins/maven-enforcer-plugin/

在一個稍大一點的組織或團隊中,你無法保證所有成員都熟悉Maven,那他們做一些比較愚蠢的事情就會變得很正常。

例如給專案引入了外部的SNAPSHOT依賴而導致構建不穩定,使用了一個與大家不一致的Maven版本而經常抱怨構建出現詭異問題。

maven-enforcer-plugin能夠幫助你避免之類問題,它允許你建立一系列規則強制大家遵守,包括設定Java版本、設定Maven版本、禁止某些依賴、禁止SNAPSHOT依賴。

只要在一個父POM配置規則,然後讓大家繼承,當規則遭到破壞的時候,Maven就會報錯。

除了標準的規則之外,你還可以擴充套件該外掛,編寫自己的規則。maven-enforcer-plugin的enforce目標負責檢查規則,它預設繫結到生命週期的validate階段。

maven-help-plugin

http://maven.apache.org/plugins/maven-help-plugin/

maven-help-plugin是一個小巧的輔助工具。

最簡單的help:system可以列印所有可用的環境變數和Java系統屬性。

help:effective-pom和help:effective-settings最為有用,它們分別列印專案的有效POM和有效settings,有效POM是指合併了所有父POM(包括Super POM)後的XML,

當你不確定POM的某些資訊從何而來時,就可以檢視有效POM。

有效settings同理,特別是當你發現自己配置的settings.xml沒有生效時,就可以用help:effective-settings來驗證。

此外,maven-help-plugin的describe目標可以幫助你描述任何一個Maven外掛的資訊,還有all-profiles目標和active-profiles目標幫助檢視專案的Profile。

maven-release-plugin

http://maven.apache.org/plugins/maven-release-plugin/

maven-release-plugin的用途是幫助自動化專案版本釋出,它依賴於POM中的SCM資訊。

release:prepare用來準備版本釋出,具體的工作包括檢查是否有未提交程式碼、檢查是否有SNAPSHOT依賴、升級專案的SNAPSHOT版本至RELEASE版本、為專案打標籤等等。

release:perform則是簽出標籤中的RELEASE原始碼,構建併發布。版本釋出是非常瑣碎的工作,它涉及了各種檢查,而且由於該工作僅僅是偶爾需要,因此手動操作很容易遺漏一些細節。

maven-release-plugin讓該工作變得非常快速簡便,不易出錯。maven-release-plugin的各種目標通常直接在命令列呼叫,因為版本釋出顯然不是日常構建生命週期的一部分。

maven-resources-plugin

http://maven.apache.org/plugins/maven-resources-plugin/

為了使專案結構更為清晰,Maven區別對待Java程式碼檔案和資原始檔,maven-compiler-plugin用來編譯Java程式碼,maven-resources-plugin則用來處理資原始檔。

預設的主資原始檔目錄是src/main/resources,很多使用者會需要新增額外的資原始檔目錄,這個時候就可以通過配置maven-resources-plugin來實現。

此外,資原始檔過濾也是Maven的一大特性,你可以在資原始檔中使用${propertyName}形式的Maven屬性,然後配置maven-resources-plugin開啟對資原始檔的過濾,

之後就可以針對不同環境通過命令列或者Profile傳入屬性的值,以實現更為靈活的構建。

maven-surefire-plugin

http://maven.apache.org/plugins/maven-surefire-plugin/

可能是由於歷史的原因,Maven 2/3中用於執行測試的外掛不是maven-test-plugin,而是maven-surefire-plugin。

其實大部分時間內,只要你的測試類遵循通用的命令約定(以Test結尾、以TestCase結尾、或者以Test開頭),就幾乎不用知曉該外掛的存在。

然而在當你想要跳過測試、排除某些測試類、或者使用一些TestNG特性的時候,瞭解maven-surefire-plugin的一些配置選項就很有用了。

例如 mvn test -Dtest=FooTest 這樣一條命令的效果是僅執行FooTest測試類,這是通過控制maven-surefire-plugin的test引數實現的。

build-helper-maven-plugin

http://mojo.codehaus.org/build-helper-maven-plugin/

Maven預設只允許指定一個主Java程式碼目錄和一個測試Java程式碼目錄,雖然這其實是個應當儘量遵守的約定,

但偶爾你還是會希望能夠指定多個原始碼目錄(例如為了應對遺留專案),build-helper-maven-plugin的add-source目標就是服務於這個目的,

通常它被繫結到預設生命週期的generate-sources階段以新增額外的原始碼目錄。需要強調的是,這種做法還是不推薦的,

因為它破壞了 Maven的約定,而且可能會遇到其他嚴格遵守約定的外掛工具無法正確識別額外的原始碼目錄。

build-helper-maven-plugin的另一個非常有用的目標是attach-artifact,

使用該目標你可以以classifier的形式選取部分專案檔案生成附屬構件,並同時install到本地倉庫,也可以deploy到遠端倉庫。

exec-maven-plugin

http://mojo.codehaus.org/exec-maven-plugin/

exec-maven-plugin很好理解,顧名思義,它能讓你執行任何本地的系統程式,

在某些特定情況下,執行一個Maven外部的程式可能就是最簡單的問題解決方案,這就是exec:exec的用途,當然,該外掛還允許你配置相關的程式執行引數。

除了exec目標之外,exec-maven-plugin還提供了一個java目標,該目標要求你提供一個mainClass引數,然後它能夠利用當前專案的依賴作為classpath,在同一個JVM中執行該mainClass。

有時候,為了簡單的演示一個命令列Java程式,你可以在POM中配置好exec-maven-plugin的相關執行引數,然後直接在命令執行 mvn exec:java 以檢視執行效果。

jetty-maven-plugin

http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin

在進行Web開發的時候,開啟瀏覽器對應用進行手動的測試幾乎是無法避免的,這種測試方法通常就是將專案打包成war檔案,然後部署到Web容器中,再啟動容器進行驗證,這顯然十分耗時。

為了幫助開發者節省時間,jetty-maven-plugin應運而生,它完全相容 Maven專案的目錄結構,能夠週期性地檢查原始檔,一旦發現變更後自動更新到內建的Jetty Web容器中。

做一些基本配置後(例如Web應用的contextPath和自動掃描變更的時間間隔),你只要執行 mvn jetty:run ,然後在IDE中修改程式碼,程式碼經IDE自動編譯後產生變更,

再由jetty-maven-plugin偵測到後更新至Jetty容器,這時你就可以直接測試Web頁面了。

需要注意的是,jetty-maven-plugin並不是宿主於Apache或Codehaus的官方外掛,因此使用的時候需要額外的配置settings.xml的pluginGroups元素,將org.mortbay.jetty這個pluginGroup加入。

versions-maven-plugin

http://mojo.codehaus.org/versions-maven-plugin/

很多Maven使用者遇到過這樣一個問題,當專案包含大量模組的時候,為他們集體更新版本就變成一件煩人的事情,到底有沒有自動化工具能幫助完成這件事情呢?

(當然你可以使用sed之類的文字操作工具,不過不在本文討論範圍)答案是肯定的,versions-maven- plugin提供了很多目標幫助你管理Maven專案的各種版本資訊。

例如最常用的,命令 mvn versions:set -DnewVersion=1.1-SNAPSHOT 就能幫助你把所有模組的版本更新到1.1-SNAPSHOT。

該外掛還提供了其他一些很有用的目標,display-dependency- updates能告訴你專案依賴有哪些可用的更新;

類似的display-plugin-updates能告訴你可用的外掛更新;然後use- latest-versions能自動幫你將所有依賴升級到最新版本。

最後,如果你對所做的更改滿意,則可以使用 mvn versions:commit 提交,不滿意的話也可以使用 mvn versions:revert 進行撤銷。

五、使用案例

① maven-jetty-plugin

http://blog.sina.com.cn/s/blog_62b0363101012he0.html

http://stamen.iteye.com/blog/1933452

輸入:mvn jetty:run。這將在埠為8080的Jetty伺服器上啟動你的專案。Jetty將持續執行,直到外掛是明確停止。例如,按下<ctrl-c>,或使用mvn jetty:stop命令。

    <build>
        <finalName>rop-sample</finalName>
        <plugins>
            <!-- jetty外掛 -->
            <plugin>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>maven-jetty-plugin</artifactId>
                <version>6.1.5</version>
                <configuration>
                    <webAppSourceDirectory>src/main/webapp</webAppSourceDirectory>
                    <scanIntervalSeconds>3</scanIntervalSeconds>
                    <contextPath>/</contextPath>
                    <connectors>
                        <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                            <port>8088</port>
                        </connector>
                    </connectors>
                </configuration>
            </plugin>
        </plugins>
    </build>

② maven-compiler-plugin 編譯原始碼

在Maven專案下,我們需要配置"maven-compiler-plugin"的"encoding"引數

 <plugins> 
         <plugin> 
            <groupId>org.apache.maven.plugins</groupId> 
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version> 
            <configuration>
                <encoding>UTF8</encoding> 
            </configuration> 
         </plugin> 
    </plugins>

需要在編譯和生成的時候使用不同的jdk版本

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
          <source>1.6</source>
          <target>1.7</target>
        </configuration>
      </plugin>

③ maven-war-plugin

打包war專案的時候排除某些web資原始檔,這時就應該配置maven-war-plugin如下:

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
    <configuration>
      <webResources>
        <resource>
          <directory>src/main/webapp</directory>
          <excludes>
            <exclude>**/*.jpg</exclude>
          </excludes>
        </resource>
      </webResources>
    </configuration>
  </plugin>

④ maven-source-plugin 生成原始碼包

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>2.1.2</version>
    <executions>
      <execution>
        <id>attach-sources</id>
        <phase>verify</phase>
        <goals>
          <goal>jar-no-fork</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

<!-- 原始碼打包外掛 -->

<plugin>  
    <artifactId>maven-source-plugin</artifactId>  
    <version>2.1</version>  
    <configuration>  
        <!-- <finalName>${project.build.name}</finalName> -->  
        <attach>true</attach>  
        <encoding>${project.build.sourceEncoding}</encoding>  
    </configuration>  
    <executions>  
        <execution>  
            <phase>compile</phase>  
            <goals>  
                <goal>jar</goal>  
            </goals>  
        </execution>  
    </executions>  
</plugin>

⑤ maven-javadoc-plugin 生成javadoc包

<plugin>          
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.7</version>
    <executions>
      <execution>
        <id>attach-javadocs</id>
          <goals>
            <goal>jar</goal>
          </goals>
      </execution>
    </executions>
  </plugin> 

⑥ maven-assembly-plugin

它支援各種打包檔案格式,包括zip、tar.gz、tar.bz2等等,通過一個打包描述檔案(該例中是src/main/assembly.xml),它能夠幫助使用者選擇具體打包哪些檔案集合、依賴、模組、和甚至本地倉庫檔案,每個項的具體打包路徑使用者也能自由控制。如下就是對應上述需求的打包描述檔案src/main/assembly.xml:

<assembly>
  <id>bin</id>
  <formats>
    <format>zip</format>
  </formats>
  <dependencySets>
    <dependencySet>
      <useProjectArtifact>true</useProjectArtifact>
      <outputDirectory>lib</outputDirectory>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <outputDirectory>/</outputDirectory>
      <includes>
        <include>README.txt</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>src/main/scripts</directory>
      <outputDirectory>/bin</outputDirectory>
      <includes>
        <include>run.sh</include>
        <include>run.bat</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>
最終生成一個zip格式的分發包,它包含如下的一個結構:
​
bin/
lib/
README.txt

最後,我們需要配置maven-assembly-plugin使用打包描述檔案,並繫結生命週期階段使其自動執行打包操作:

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2.1</version>
    <configuration>
      <descriptors>
        <descriptor>src/main/assembly/assembly.xml</descriptor>
      </descriptors>
    </configuration>
    <executions>
      <execution>
        <id>make-assembly</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

執行mvn clean package之後,我們就能在target/目錄下得到名為hello-world-1.0-bin.zip的分發包了。

 

⑦ maven-surefire-plugin 打包時跳過單元測試

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>

mvn package -Dmaven.test.skip=true

如果單元測試中有輸出中文,eclipse的控制檯裡中文可能會變成亂碼輸出,也可以通過這個外掛解決,參考配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.16</version>
    <configuration>
        <forkMode>once</forkMode>
        <argLine>-Dfile.encoding=UTF-8</argLine>
</plugin>

⑧ maven-resource-plugin

<!-- 設定資原始檔的編碼方式 -->

<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-resources-plugin</artifactId>  
    <version>2.4.3</version>  
    <executions>  
        <execution>  
            <phase>compile</phase>  
        </execution>  
    </executions>  
    <configuration>  
        <encoding>${project.build.sourceEncoding}</encoding>  
    </configuration>  
</plugin>  

把web專案的輸出copy到tomcat的webapp下

<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-resources-plugin</artifactId>  
    <version>2.5</version>  
    <executions>  
        <execution>  
            <id>deploy-website</id>  
            <phase>package</phase>  
            <goals>  
                <goal>copy-resources</goal>  
            </goals>  
            <configuration>  
                <outputDirectory>${server_home}/webapps/${project.build.finalName}</outputDirectory>  
                <resources>  
                    <resource>  
                        <directory>${project.build.directory}/${project.build.finalName}</directory>  
                    </resource>  
                </resources>  
            </configuration>  
        </execution>  
    </executions>  
</plugin>  

⑨ maven-dependency-plugin

自動拷貝jar包到target目錄

<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-dependency-plugin</artifactId>  
    <version>2.6</version>  
    <executions>  
        <execution>  
            <id>copy-dependencies</id>  
            <phase>compile</phase>  
            <goals>  
                <goal>copy-dependencies</goal>  
            </goals>  
            <configuration>  
                <!-- ${project.build.directory}為Maven內建變數,預設為target -->  
                <outputDirectory>${project.build.directory}/lib</outputDirectory>  
                <!-- 表示是否不包含間接依賴的包 -->  
                <excludeTransitive>false</excludeTransitive>  
                <!-- 表示複製的jar檔案去掉版本資訊 -->  
                <stripVersion>true</stripVersion>  
            </configuration>  
        </execution>  
    </executions>  
</plugin>  

在部署war包時,需要將專案依賴的jar包,也打到war包中,因此就會用到上述外掛

⑩ 在打包時,需要清空一些指定的目錄

在一個J2EE專案中,想使用mvn clean命令清除target裡的內容的同時,也清除tomcat/webapp下的相應目錄,該怎麼辦呢?

<plugin>  
    <artifactId>maven-clean-plugin</artifactId>  
    <configuration>  
        <verbose>true</verbose>  
        <filesets>  
            <fileset>  
                <directory>c:/a/b/c/</directory>  
            </fileset>  
      </filesets>  
    </configuration>  
</plugin>  

本例中,刪除的是c:/a/b/c/目錄.

當用戶在該maven專案中執行mvn clean後,除了刪除clean外掛預設的

project.build.directory

project.build.outputDirectory

project.build.testOutputDirectory

project.reporting.outputDirectory

c:/a/b/c/

11、利用tomcat-maven-plugin外掛將專案自動打包並部署到tomcat中

  <plugin>  
        <groupId>org.codehaus.mojo</groupId>  
        <artifactId>tomcat-maven-plugin</artifactId>  
        <configuration>  
            <server>tomcat6-manager</server>  
            <path>/${project.build.name}</path>  
            <url>http://localhost:8080/manager</url>  
            <username>admin</username>  
            <password>admin</password>  
        </configuration>  
        <executions>  
            <execution>  
                <phase>deploy</phase>  
                <goals>  
                    <goal>deploy</goal>  
                </goals>  
            </execution>  
        </executions>  
    </plugin>  
</plugins>  

path: 是指專案部署到tomcat後的專案名稱 url: 是指tomcat的manager訪問地址 server: 這個是tomcat服務名稱設定,需要配置maven的settings.xml檔案,在servers節點中手動配置server,如下所示:

<server>  
    <id>tomcat6-manager</id>  
    <username>admin</username>  
    <password>admin</password>  
</server> 

12、利用cargo-maven2-plugin外掛將專案自動打包並部署到tomcat中

cargo外掛可以幫助你完成WAR包到伺服器的部署及伺服器的啟動和關閉等工作,方便,快速!

<plugin>  
    <groupId>org.codehaus.cargo</groupId>  
    <artifactId>cargo-maven2-plugin</artifactId>  
    <version>1.2.0</version>  
    <configuration>  
        <container>  
            <containerId>${server_name}</containerId>  
            <home>${server_home}</home>  
        </container>  
        <configuration>  
            <type>existing</type>  
            <home>${server_home}</home>  
            <properties>  
                <cargo.servlet.port>8088</cargo.servlet.port>  
            </properties>  
        </configuration>  
    </configuration>  
</plugin>

注意,如果你的tomcat伺服器的埠使用的不是預設的8080(如本例中的8088),則需要使用cargo.servlet.port引數將cargo的監聽埠也配置到tomcat的那個監聽埠(如本例中的8088),否則使用mvn cargo:run啟動的伺服器會在120000毫秒(120秒)後自動關閉!

mvn cargo:start命令完成WAR包部署後,啟動伺服器,然後會將伺服器立即關掉;

mvn cargo:run命令完成WAR包部署後,啟動伺服器,直到你Ctrl+C將伺服器關掉;

mvn cargo:stop命令關閉伺服器。

參考:http://cargo.codehaus.org/Maven2+plugin

        <plugin>  
                <!-- 指定外掛名稱及版本號 -->  
                <groupId>org.codehaus.cargo</groupId>  
                <artifactId>cargo-maven2-plugin</artifactId>  
                <version>1.2.3</version>  
<!-- 外掛的Tomcat6.x配置 -->  
                <configuration>  
                    <!-- 容器的配置 -->  
                    <container>  
                        <!-- 指定伺服器版本 -->  
                        <containerId>tomcat6x</containerId>  
                        <!-- 指定伺服器的安裝目錄 -->  
                        <home>E:\Program Files\tomcat-6.0.32</home>  
                    </container>  
                    <!-- 具體的配置 -->  
                    <configuration>  
                        <!-- 部署模式:existing、standalone等 -->  
                        <type>existing</type>  
                        <!-- Tomcat的位置,即catalina.home -->  
                        <home>E:\Program Files\tomcat-6.0.32</home>  
                        <!-- 配置屬性 -->  
                        <properties>  
                            <!-- 管理地址 -->  
                            <cargo.tomcat.manager.url>http://localhost:8080/manager</cargo.tomcat.manager.url>  
                            <!-- Tomcat使用者名稱 -->  
                            <cargo.remote.username>admin</cargo.remote.username>  
                            <!-- Tomcat密碼 -->  
                            <cargo.remote.password>admin</cargo.remote.password>  
                            <!-- <cargo.jvmargs> -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8787 </cargo.jvmargs> -->  
                        </properties>  
                    </configuration>  
                </configuration>  
            </plugin>     

十、聚合&繼承

 

百度雲盤下載連線

連結:https://pan.baidu.com/s/1T6AkkOvJ0RdST08jzNwHbQ 

 密碼:53ui

線上檢視

http://www.lhm635.cn/java/maven/Maven.pdf