eclipse插件——maven

項目開發中遇到的問題

  • 都是一樣的代碼,爲何在個人機器上能夠編譯執行,而在他的機器上就不行? java

  • 爲何在個人機器上能夠正常打包,而配置管理員卻打不出來? mysql

  • 項目組加入了新的人員,我要給他說明編譯環境如何設置,可是讓我撓頭的是,有些細節我也記不清楚了git

  • 個人項目依賴一些jar包,我應該把他們放哪裏?放源碼庫裏?github

  • 這是我開發的第二個項目,仍是須要上面的那些jar包,再把它們複製到我當前項目的svn庫裏吧 web

  • 如今是第三次,再複製一次吧 —– 這樣真的好嗎? spring

  • 我寫了一個數據庫相關的通用類,而且推薦給了其餘項目組,如今已經有五個項目組在使用它了,今天我發現了一個bug,並修正了它,我會把jar包經過郵件發給其餘項目組,這不是一個好的分發機制,太多的環節可能致使出現bugsql

  • 項目進入測試階段,天天都要向測試服務器部署一版。每次都手動部署,太麻煩了 數據庫


什麼是maven

Maven的概念

  • maven翻譯爲「專家」,「內行」。Maven是基於項目對象模型(POM),能夠經過一小段描述信息來管理項目的構建,報告和文檔的軟件項目管理工具。
  • Maven是跨平臺的項目管理工具。主要服務於基於Java平臺的項目構建,依賴管理和項目信息管理。
  • Maven主要有兩個功能:
    • 項目構建
    • 依賴管理

什麼是構建

這裏寫圖片描述

爲何使用maven?

  • Eclipse
    手工操做較多,編譯、測試、部署等工做都是獨立的,很難一步完成
    每一個人的IDE配置都不一樣,很容易出現本地代碼換個地方編譯就出錯
  • Ant
    沒有一個約定的目錄結構
    必須明確讓ant作什麼,何時作,而後編譯,打包
    沒有生命週期,必須定義目標及其實現的任務序列
    沒有集成依賴管理
  • Maven
    擁有約定,知道你的代碼在哪裏,放到哪裏去
    擁有一個生命週期,例如執行 mvn install 就能夠自動執行編譯,測試,打包等構建過程只須要定義一個pom.xml,而後把源碼放到默認的目錄,Maven幫你處理其餘事情

Maven模型

這裏寫圖片描述


Maven的安裝及配置

下載maven

Maven的安裝

  • 第一步:安裝jdk,要求1.6或以上版本
  • 第二步:解壓maven的壓縮包。解壓目錄最好不要有中文。
  • 這裏寫圖片描述
  • 第三步:配置系統環境變量,MAVEN_HOME
  • 第四步:設置環境變量Path,將%MAVEN_HOME%\bin加入Path中,必定要注意要用分號;與其餘值隔開
  • 第五步:5.驗證安裝是否成功,打開cmd窗口,敲入mvn -v 查看
  • 這裏寫圖片描述

Maven安裝目錄分析

  • bin:含有mvn運行的腳本
  • boot:含有plexus-classworlds類加載器框架。plexus-classworlds是一個類加載器框架,相對於默認的java類加載器,它提供了更豐富的語法以方便配置,Maven使用該框架加載本身的類庫。對於通常的Maven用戶來講,沒必要關心該文件。
  • conf:含有settings.xml配置文件,此配置爲maven的全局配置。
  • lib:含有Maven運行時所須要的java類庫
    LICENSE.txt, NOTICE.txt, README.txt針對Maven版本,第三方軟件等簡要介紹

Maven的配置

  • Maven的默認配置
    • 在MAVEN_HOME下的配置文件:MAVEN_HOME/conf/settings.xml 是maven全局的配置。若是不對其修改的話,默認本地倉庫的路徑就是:當前用戶路徑C:\Users[UserName].m2
    • 這裏寫圖片描述
    • localRepository:用戶倉庫,用於檢索依賴包路徑
  • 用戶配置

    • 配置方法:
      • 一、在你想保存倉庫的位置建立一個目錄做爲倉庫目錄。例如在d:盤建立一個MavenRepository目錄
      • 二、在其中建立一個名爲「repository」的目錄。
      • 三、修改MAVEN_HOME\conf\settings.xml
      • 這裏寫圖片描述
      • 四、從MAVEN_HOME\conf中把settings.xml複製到MavenRepository目錄。獲得以下結構:
      • 這裏寫圖片描述
      • !注意:
        用戶級別的倉庫在全局配置中一旦設置,全局配置將再也不生效,轉用用戶所設置的倉庫,不然使用默認路徑倉庫

建立Maven工程

  • 4.1 聽從Maven約定

    src/main/java —— 存放項目的.java文件
    src/main/resources —— 存放項目資源文件,如spring, hibernate配置文件
    src/test/java —— 存放全部測試.java文件,如JUnit測試類
    src/test/resources —— 測試資源文件
    target —— 項目輸出位置
    pom.xml——maven項目核心配置文件

    Project
    |-src
    | |-main
    | | |-java —— 存放項目的.java文件
    | | |-resources —— 存放項目資源文件,如spring, hibernate配置文件
    | |-test
    | |-java ——存放全部測試.java文件,如JUnit測試類
    | |-resources —— 測試資源文件
    |-target —— 目標文件輸出位置例如.class、.jar、.war文件
    |-pom.xml ——maven項目核心配置文件

  • 4.2 第一步:建立maven工程

    首先創建MavenHelloWorld項目同時創建Maven約定的目錄結構

    MavenHelloWorld
    |-src
    | |-main
    | | |-java —— 存放項目的.java文件
    | | |-resources —— (暫時省略)
    | |-test
    | |-java ——存放全部測試.java文件,如JUnit測試類
    | |-resources —— (暫時省略)
    |-target —— (不手工建立)
    |-pom.xml ——maven項目核心配置文件

  • 4.3 第二步:建立HelloWorld.java

    • 在src/main/java/cn/change/maven目錄下新建文件Hello.java

      package cn.change.maven;
      
      public class HelloWorld {
          public String sayHello(String name){
              return "Hello World :" + name + "!";
          }
      }
  • 4.4 第三步:新建測試文件HelloTest.java

    • 在/src/test/java/cn/change/maven目錄下新建測試文件HelloTest.java

      package cn.change.maven;
      
      import org.junit.Test;
      import static junit.framework.Assert.*;
      
      public class HelloWorldTest{
      
          @Test
          public void testHello(){
      
              HelloWorld hello = new HelloWorld();
              String results = hello.sayHello("maven");
              assertEquals("Hello World :maven!",results);
      
          }
      
      }
  • 4.5 第四步:建立pom.xml

    • 在項目MavenHelloWorld根目錄創建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/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.bshinfo.el</groupId>
        <artifactId>ccb_el_manager</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>ccb_el_manager Maven Webapp</name>
        <url>http://maven.apache.org</url>
        <packaging>war</packaging>
        <build>
          <finalName>ccb_el_manager</finalName>
        </build>
      
        <dependencies>
              <dependency>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>4.11</version>
                  <scope>test</scope>
              </dependency>
      
              <!-- spring jar -->
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-core</artifactId>
                  <version>4.2.5.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-context</artifactId>
                  <version>4.2.5.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-context-support</artifactId>
                  <version>4.2.5.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-tx</artifactId>
                  <version>4.2.5.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-aop</artifactId>
                  <version>4.2.5.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-beans</artifactId>
                  <version>4.2.5.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-jdbc</artifactId>
                  <version>4.2.5.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework.security</groupId>
                  <artifactId>spring-security-core</artifactId>
                  <version>4.0.4.RELEASE</version>
              </dependency>
              <dependency> 
                  <groupId>org.springframework.security</groupId>
                  <artifactId>spring-security-web</artifactId>
                  <version>4.0.4.RELEASE</version>
              </dependency>
              <dependency> 
                  <groupId>org.springframework.security</groupId>
                  <artifactId>spring-security-config</artifactId>
                  <version>4.0.4.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework.security</groupId>
                  <artifactId>spring-security-cas</artifactId>
                  <version>4.0.4.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-jms</artifactId>
                  <version>4.2.5.RELEASE</version>
              </dependency>
      
              <!-- spring mvc jar -->
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-web</artifactId>
                  <version>4.2.5.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-webmvc</artifactId>
                  <version>4.2.5.RELEASE</version>
              </dependency>
      
              <!-- mybatis jar -->
              <dependency>
                  <groupId>org.mybatis</groupId>
                  <artifactId>mybatis</artifactId>
                  <version>3.3.1</version>
              </dependency>
      
               <!-- mybatis-paginator jar -->
              <dependency>
                  <groupId>com.github.miemiedev</groupId>
                  <artifactId>mybatis-paginator</artifactId>
                  <version>1.2.10</version>
              </dependency>
      
              <!-- mybatis-spring jar -->
              <dependency>
                  <groupId>org.mybatis</groupId>
                  <artifactId>mybatis-spring</artifactId>
                  <version>1.2.4</version>
              </dependency>
      
              <!-- mysql-connector-java jar -->
              <dependency>
                  <groupId>mysql</groupId>
                  <artifactId>mysql-connector-java</artifactId>
                  <version>5.1.38</version>
              </dependency>
              <!-- 數據庫鏈接池 jar -->
              <dependency>
                  <groupId>commons-dbcp</groupId>
                  <artifactId>commons-dbcp</artifactId>
                  <version>1.4</version>
              </dependency>
              <dependency>
                  <groupId>commons-pool</groupId>
                  <artifactId>commons-pool</artifactId>
                  <version>1.6</version>
              </dependency>
      
              <!-- log jar -->
              <dependency>
                  <groupId>log4j</groupId>
                  <artifactId>log4j</artifactId>
                  <version>1.2.17</version>
              </dependency>
              <dependency>
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-api</artifactId>
                  <version>1.7.19</version>
              </dependency>
              <dependency>
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-log4j12</artifactId>
                  <version>1.7.19</version>
              </dependency>
      
              <!-- jsp Template jar -->
              <dependency>
                  <groupId>org.freemarker</groupId>
                  <artifactId>freemarker</artifactId>
                  <version>2.3.23</version>
              </dependency>
      
              <!-- apache servlet api jar -->
              <dependency>
                  <groupId>org.apache.tomcat</groupId>
                  <artifactId>tomcat-servlet-api</artifactId>
                  <version>8.0.32</version>
              </dependency>
      
              <dependency>
                  <groupId>org.aspectj</groupId>
                  <artifactId>aspectjweaver</artifactId>
                  <version>1.8.9</version>
              </dependency>
      
              <dependency>
                  <groupId>org.aspectj</groupId>
                  <artifactId>aspectjrt</artifactId>
                  <version>1.8.9</version>
              </dependency>
      
              <dependency>
                  <groupId>org.aspectj</groupId>
                  <artifactId>aspectjtools</artifactId>
                  <version>1.8.9</version>
              </dependency>
      
              <!-- activemq -->
              <dependency>  
                  <groupId>org.apache.activemq</groupId>  
                  <artifactId>activemq-core</artifactId>  
                  <version>5.7.0</version>
              </dependency>
              <dependency>
                  <groupId>org.apache.activemq</groupId>
                  <artifactId>activemq-pool</artifactId>
                  <version>5.13.2</version>
              </dependency>
      
              <!-- cas security -->
              <dependency>
                  <groupId>org.jasig.cas.client</groupId>
                  <artifactId>cas-client-core</artifactId>
                  <version>3.4.1</version>
              </dependency>
              <!-- end of cas security -->
              <dependency>
                  <groupId>net.sf.json-lib</groupId>
                  <artifactId>json-lib</artifactId>
                  <version>2.4</version>
                  <classifier>jdk15</classifier>
              </dependency>
              <dependency>
                  <groupId>commons-codec</groupId>
                  <artifactId>commons-codec</artifactId>
                  <version>1.10</version>
              </dependency>
              <dependency>
                  <groupId>org.codehaus.jackson</groupId>
                  <artifactId>jackson-mapper-asl</artifactId>
                  <version>1.5.0</version>
              </dependency>
              <dependency>
                  <groupId>commons-fileupload</groupId>
                  <artifactId>commons-fileupload</artifactId>
                  <version>1.2.2</version>
              </dependency>
              <dependency>
                  <groupId>org.apache.commons</groupId>
                  <artifactId>commons-io</artifactId>
                  <version>1.3.2</version>
              </dependency>
          </dependencies>
      </project>
  • 4.6 第五步:測試maven命令

    • 打開cmd命令行,進入Hello項目根目錄(包含有pom.xml文件的目錄)
    • 4.6.1 mvn compile命令

      • 執行完畢後,生成了maven工程編譯完成後字節碼文件的生成目錄target
      • 執行 mvn compile命令
      • 執行完畢後,生成了maven工程編譯完成後字節碼文件的生成目錄target
    • 4.6.2 mvn clean命令

      • cmd 中繼續錄入mvn clean命令
      • 執行完畢後,字節碼生成目錄被刪除
    • 4.6.3 mvn test命令

      • cmd 中錄入 mvn test命令
      • 執行完畢後,字節碼生成目錄中生成了被測試類與測試類的編譯字節碼和測試執行過程日誌與詳細報告
    • 4.6.4 mvn clean compile命令

      • cmd 中錄入 mvn clean compile命令
      • 組合指令,先執行clean,再執行compile,一般應用於上線前執行,清除測試類
    • 4.6.5 mvn clean test命令

      • cmd 中錄入 mvn clean test命令
      • 組合指令,先執行clean,再執行test,一般應用於測試環節
    • 4.6.6 mvn clean package命令

      • cmd 中錄入 mvn clean package命令
      • 組合指令,先執行clean,再執行package,將項目打包,一般應用於發佈前
      • 執行過程:
        • 清理————清空環境
        • 編譯————編譯源碼
        • 測試————測試源碼
        • 打包————將編譯的非測試類打包
    • 4.6.7 mvn clean install命令
      • cmd 中錄入 mvn clean install 查看倉庫,當前項目被髮布到倉庫中
      • 組合指令,先執行clean,再執行install,將項目打包,一般應用於發佈前
      • 執行過程:
      • 清理————清空環境
      • 編譯————編譯源碼
      • 測試————測試源碼
      • 打包————將編譯的非測試類打包
      • 部署————將打好的包發佈到資源倉庫中
      • 這裏寫圖片描述
    • 4.6.8 錯誤範例
      說明:MAVEN 命令輸入錯誤,命令名稱顯示在[ERROR] Unknown lifecycle phase 「compoile」
      引號中的內容爲輸入錯誤的名稱
      [ERROR] Unknown lifecycle phase 「compoile」. You must specify a valid lifecycle p
      hase or a goal in the format : or :

M2Eclipse

  • 5.1 安裝m2eclipse插件
    • Maven插件的位置,在參考資料\eclipse插件目錄下:
    • 這裏寫圖片描述
    • 只須要把這兩個文件件複製到Eclipse安裝目錄下的dropins目錄下便可。
    • 這裏寫圖片描述
    • 這裏寫圖片描述
  • 5.2 配置maven插件
    • 查看maven插件是否安裝成功:啓動Eclipse→window→preference→Maven
    • 這裏寫圖片描述
    • 二、設置maven環境,也就是指定maven的安裝目錄
    • 這裏寫圖片描述
    • 三、加載用戶配置
    • 這裏寫圖片描述
  • 5.3 建立maven工程

    • 5.3.1 第一個maven工程
      • 第一步:選擇new→maven→Maven Project
      • 這裏寫圖片描述
      • 第二步:next
      • 這裏寫圖片描述
      • 第三步:next
      • 這裏寫圖片描述
      • 選擇maven的工程骨架,這裏咱們選擇quickstart。點擊next。
      • 第四步:next
      • 這裏寫圖片描述
      • 輸入GroupId、ArtifactId、Version、Package信息點擊finish完成。
      • 這裏寫圖片描述
    • 5.3.2 執行maven命令
      • 在Eclipse的maven插件中執行maven命令,須要在maven工程或者pom.xml文件上點擊右鍵,選擇Run as→maven build.
      • 這裏寫圖片描述
    • 5.3.3 第二個maven工程

      • 5.3.3.1 建立工程
      • 第一個工程建立時選用的是maven插件提供的工程骨架,每次選擇骨架時都須要聯網下載,若是網絡不通或者較慢的狀況下會有很長時間的等待。使用非常不方便,因此建立工程時能夠不選擇骨架直接建立工程。
      • 第一步:新建maven工程
      • 這裏寫圖片描述
      • 這裏寫圖片描述
      • 輸入Groupid、artifactid、version三項內容,而後選擇packaging也就是工程的打包格式,經常使用的打包格式爲jar、war、pom三種。
      • 第三步:點擊finish完成。

      • 5.3.3.2 修改pom文件

      • 需求:在second工程中調用first工程中的First類的方法,而後測試。
      • `
package cn.change.second;

import cn.change.first.First;

public class Second {

    public String say(String name) {
        First first = new First();
        String result = first.say(name);
 return result + ":second";
    }
}
- 5.3.3.4 建立SecondTest.java
package cn.change.sencond;

import org.junit.Assert;
import org.junit.Test;

import cn.change.second.Second;

public class SecondTest {

    @Test
    public void testSay() {
        Second second = new Second();
        String result = second.say("張三");
        Assert.assertEquals("hello 張三:first:second", result);
    }
}
- 5.3.3.5 測試工程

    -  ![這裏寫圖片描述](http://img.blog.csdn.net/20160905135716735)
    - 若是maven-first工程沒有安裝則會出現如下錯誤:

[INFO] Scanning for projects…
[INFO]
[INFO] ————————————————————————
[INFO] Building maven-second 0.0.1-SNAPSHOT
[INFO] ————————————————————————
[WARNING] The POM for cn.change:maven-first:jar:0.0.1-SNAPSHOT is missing, no dependency information available
[INFO] ————————————————————————
[INFO] BUILD FAILURE
[INFO] ————————————————————————
[INFO] Total time: 0.218s
[INFO] Finished at: Fri Sep 25 15:06:00 CST 2015
[INFO] Final Memory: 4M/15M
[INFO] ————————————————————————
[ERROR] Failed to execute goal on project maven-second: Could not resolve dependencies for project cn.change:maven-second:jar:0.0.1-SNAPSHOT: Could not find artifact cn.change:maven-first:jar:0.0.1-SNAPSHOT -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
提示找不到maven-first的jar包。當系統運行時是從本地倉庫中找依賴的jar包的,因此必須先將maven-first安裝才能正常運行,須要在maven-first工程上運行 mvn install命令安裝到本地倉庫。

- 5.3.4 第三個工程
  -  建立第三個工程此工程使用maven-second工程中的Second的方法,並測試。
  -  5.3.4.1    建立工程
    -  ![這裏寫圖片描述](http://img.blog.csdn.net/20160905135828749)
  - 5.3.4.2 修改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>cn.change</groupId>
    <artifactId>maven-third</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
            <scope>test</scope>
        </dependency>
        <!-- 依賴maven-first工程 -->
        <dependency>
            <groupId>cn.change</groupId>
            <artifactId>maven-second</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>
- 5.3.4.3 依賴關係
    -  ![這裏寫圖片描述](http://img.blog.csdn.net/20160905135916970)
  - 5.3.4.4 建立Third.java
package cn.change.third;

import cn.change.second.Second;

public class Third {

    public String say(String name) {
        Second second = new Second();
        String result = second.say(name);
        return result + ":third";
    }
}
- 5.3.4.5 建立ThirdTest.java
package cn.change.third;

import org.junit.Assert;
import org.junit.Test;

public class ThirdTest {
    @Test
    public void testSay() {
        Third third = new Third();
        String result = third.say("張三");
        Assert.assertEquals("hello 張三:first:second:third", result);
    }
}

Maven核心概念

Maven的核心概念包括:座標、依賴管理、倉庫管理、生命週期、插件和目標、
聚合繼承。

  • 6.1 座標

    • 6.1.1 什麼是座標

      • groupId:定義當前Maven組織名稱
      • artifactId:定義實際項目名稱
      • version:定義當前項目的當前版本
      • packaging:定義該項目的打包方式,若是沒有此項則默認爲jar包。
    • 6.1.2 Maven座標主要組成

      • Maven世界擁有大量構建,咱們須要找一個用來惟一標識一個構建的統一規範
        擁有了統一規範,就能夠把查找工做交給機器
    • 6.1.3 Maven爲何使用座標

      • `依賴聲明主要包含以下元素:

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>


    `

  • 6.2 依賴管理

    • 這裏寫圖片描述
    • 其中依賴範圍scope 用來控制依賴和編譯,測試,運行的classpath的關係. 主要的是三種依賴關係以下:

    • 1.compile: 默認編譯依賴範圍。對於編譯,測試,運行三種classpath都有效

    • 2.test:測試依賴範圍。只對於測試classpath有效
    • 3.provided:已提供依賴範圍。對於編譯,測試的classpath都有效,但對於運行無效。由於由容器已經提供,例如servlet-api
    • 4.runtime:運行時提供。例如:jdbc驅動
    • 5.import
    • 6.system
    • 若是Two中使用One,Three中使用Two則稱Two是Three的直接依賴,而稱One是Three的間接依賴。
      C->B B->A
      C直接依賴B
      C間接依賴A

    • 這裏寫圖片描述

    • 這裏寫圖片描述
  • 6.3 生命週期
      -

Maven生命週期就是爲了對全部的構建過程進行抽象和統一。包括項目清理,初始化,編譯,打包,測試,部署等幾乎全部構建步驟。
生命週期能夠理解爲構建工程的步驟。

在Maven中有三套相互獨立的生命週期,請注意這裏說的是「三套」,並且「相互獨立」,這三套生命週期分別是:

Clean Lifecycle 在進行真正的構建以前進行一些清理工做。 Default Lifecycle
構建的核心部分,編譯,測試,打包,部署等等。 Site Lifecycle 生成項目報告,站點,發佈站點。
再次強調一下它們是相互獨立的,你能夠僅僅調用clean來清理工做目錄,僅僅調用site來生成站點。固然你也能夠直接運行 mvn clean
install site 運行全部這三套生命週期。

  • Maven三大生命週期
    • 6.3.2.1 clean:清理項目

clean生命週期每套生命週期都由一組階段(Phase)組成,咱們平時在命令行輸入的命令總會對應於一個特定的階段。好比,運行mvn clean ,這個的clean是Clean生命週期的一個階段。有Clean生命週期,也有clean階段。Clean生命週期一共包含了三個階段:

pre-clean 執行一些須要在clean以前完成的工做 clean 移除全部上一次構建生成的文件 post-clean
執行一些須要在clean以後馬上完成的工做

mvn clean 中的clean就是上面的clean,在一個生命週期中,運行某個階段的時候,它以前的全部階段都會被運行,也就是說,mvn
clean 等同於 mvn pre-clean clean ,若是咱們運行 mvn post-clean ,那麼
pre-clean,clean 都會被運行。這是Maven很重要的一個規則,能夠大大簡化命令行的輸入。

- 6.3.2.2   default:構建項目
  -

Default生命週期Default生命週期是Maven生命週期中最重要的一個,絕大部分工做都發生在這個生命週期中。這裏,只解釋一些比較重要和經常使用的階段:
validate generate-sources process-sources generate-resources
process-resources 複製並處理資源文件,至目標目錄,準備打包。 compile 編譯項目的源代碼。
process-classes generate-test-sources process-test-sources
generate-test-resources process-test-resources 複製並處理資源文件,至目標測試目錄。
test-compile 編譯測試源代碼。 process-test-classes test
使用合適的單元測試框架運行測試。這些測試代碼不會被打包或部署。 prepare-package package
接受編譯好的代碼,打包成可發佈的格式,如 JAR 。 pre-integration-test integration-test
post-integration-test verify install 將包安裝至本地倉庫,以讓其它項目依賴。 deploy
將最終的包複製到遠程的倉庫,以讓其它開發人員與項目共享。

運行任何一個階段的時候,它前面的全部階段都會被運行,這也就是爲何咱們運行mvn install
的時候,代碼會被編譯,測試,打包。此外,Maven的插件機制是徹底依賴Maven的生命週期的,所以理解生命週期相當重要。

- 6.3.2.3   site:生成項目站點
  -

Site生命週期

pre-site 執行一些須要在生成站點文檔以前完成的工做
site 生成項目的站點文檔
post-site 執行一些須要在生成站點文檔以後完成的工做,而且爲部署作準備
site-deploy 將生成的站點文檔部署到特定的服務器上

這裏常常用到的是site階段和site-deploy階段,用以生成和發佈Maven站點,這但是Maven至關強大的功能,Manager比較喜歡,文檔及統計數據自動生成,很好看。

  • 6.4 Maven插件

    • Maven的核心僅僅定義了抽象的生命週期,具體的任務都是交由插件完成的。每一個插件都能實現一個功能,每一個功能就是一個插件目標。Maven的生命週期與插件目標相互綁定,以完成某個具體的構建任務。 例如compile就是插件maven-compiler-plugin的一個插件目標
相關文章
相關標籤/搜索