Maven

1      Maven介紹

1.1     項目開發中遇到的問題

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

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

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

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

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

六、如今是第三次,再複製一次吧    ----- 這樣真的好嗎?數據庫

七、我寫了一個數據庫相關的通用類,而且推薦給了其餘項目組,如今已經有五個項目組在使用它了,今天我發現了一個bug,並修正了它,我會把jar包經過郵件發給其餘項目組apache

-----這不是一個好的分發機制,太多的環節可能致使出現bugapi

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

1.2     什麼是maven

svn:版本控制工具服務器

Maven是基於項目對象模型(POM),能夠經過一小段描述信息來管理項目的構建,報告和文檔的軟件項目管理工具。

Maven是跨平臺的項目管理工具。主要服務於基於Java平臺的項目構建依賴管理項目信息管理

gradle

Maven主要有兩個功能:

一、項目構建(打包(jar,war),部署)

二、依賴管理(作好配置,自定下載依賴)

1.3     什麼是構建

構建過程:

 

實施

運維(客服)

測試

開發組

1.4     項目構建的方式

一、Eclipse

手工操做較多,項目的構建過程都是獨立的,很難一步完成。好比:編譯、測試、部署等。

開發時每一個人的IDE配置都不一樣,很容易出現本地代碼換個地方編譯就出錯

二、Ant

         Ant只是一個項目構建工具,它沒有集成依賴管理。

Ant在進行項目構建時,它沒有對項目目錄結構進行約定,須要手動指定源文件、類文件等目錄地址。同時它執行task時,須要顯示指定依賴的task,這樣會形成大量的代碼重複。

三、Maven

         Maven不只是一個項目構建工具,更是一個項目管理工具。它在項目構建工程中,比ant更全面,更靈活。

Maven在進行項目構建時,它對項目目錄結構擁有約定,知道你的源代碼在哪裏,類文件應該放到哪裏去。

它擁有生命週期的概念,maven的生命週期是有順序的,在執行後面的生命週期的任務時,不須要顯示的配置前面任務的生命週期。例如執行 mvn install 就能夠自動執行編譯,測試,打包等構建過程

四、gradle   android

1.5     Maven模型

Pom.xml  maven的核心配置文件

Central:中央倉庫

                  私服

                  本地

 

plug:插件  jdk編譯插件   tomcat插件     

2      Maven安裝配置

2.1     下載maven

官方網站:http://maven.apache.org

本課程使用的maven的版本爲3.5

Maven是使用java開發,須要安裝jdk1.6以上,推薦使用1.7

2.2     Maven的安裝

第一步:安裝jdk,要求1.6或以上版本。

第二步:把maven解壓縮,解壓目錄最好不要有中文。

第三步:配置環境變量MAVEN_HOME

第四步:配置環境變量PATH,將%MAVEN_HOME%\bin加入Path中,在Windows中必定要注意要用分號;與其餘值隔開。

第五步:驗證是否安裝成功,打開cmd窗口,輸入mvn –v

2.3     Maven的配置

Maven有兩個settings.xml配置文件,一個是全局配置文件,一個是用戶配置文件。

2.3.1  全局配置(默認)

%MAVEN_HOME%/conf/settings.xml 是maven全局的配置文件。

該配置文件中配置了本地倉庫(依賴)的路徑,默認就是:~/.m2/repository。其中~表示當前用戶路徑C:\Users\[UserName]。

localRepository:用戶倉庫,用於檢索依賴包路徑

2.3.2  用戶配置

~/.m2/settings.xml是用戶的配置文件(默認沒有該文件,須要將全局配置文件拷貝過來在進行修改)

注意:通常本地倉庫的地址不使用默認配置,一般狀況下須要在用戶配置中,配置新的倉庫地址。

配置步驟以下:

第一步:建立一個本地倉庫目錄,好比E:// repository/maven。

/USERS/.m2/repository

第二步:複製maven的全局配置文件(.settings)到~/.m2目錄下,即建立用戶配置文件

第三步:修改maven的用戶配置文件。

注意:

用戶級別的倉庫在全局配置中一旦設置,全局配置將再也不生效,轉用用戶所設置的倉庫,不然使用全局配置文件中的默認路徑倉庫(全局:maven/conf/settings.xml  用戶:用戶:~/.m2/settings.xml

3      建立Maven工程

3.1     Maven的工程結構

Project

  |-src

  |   |-main

  |   |  |-java        —— 存放項目的.java文件

  |   |  |-resources   —— 存放項目資源文件,如spring, hibernate配置文件

  |   |  |-webapp     ———存放jsp,html,web.xml等網頁文件   WebContent

  |   |-test   測試代碼

  |      |-java        ——存放全部測試.java文件,如JUnit測試類

  |      |-resources   —— 測試資源文件

  |-target             —— 目標文件輸出位置例如.class、.jar、.war文件

  |-pom.xml           ——maven項目核心配置文件

3.2     Maven的工程建立

3.2.1  第一步:根據maven的目錄結構建立HelloMaven工程

target目錄會在編譯以後自動建立。

3.2.2  第二步:建立HelloWorld.java

在src/main/java/com/qf/maven目錄下新建文件Hello.java

package com.qf.maven;

 

public class HelloWorld {

            public String sayHello(String name){

                       return "Hello World :" + name + "!";

            }

}

 

3.2.3  第三步:建立TestHelloWorld.java

package com.qf.maven;

 

import org.junit.Test;

import static junit.framework.Assert.*;

 

public class TestHelloWorld{

        

         @Test

         public void testSayHello(){

                  HelloWorld hw = new HelloWorld();

                  String result = hw.sayHello("zhangsan");

                  assertEquals("hello zhangsan",result);

         }      

}

 

3.2.4  第四步:配置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">

  <!-- 版本:4.0.0 -->

  <modelVersion>4.0.0</modelVersion>

  <!-- 組織名稱:暫時使用 組織名稱+項目名稱 做爲組織名稱 -->

  <!-- 組織名稱:實際名稱 按照訪問路徑規範設置,一般以功能做爲名稱:eg: junit spring -->

  <groupId>com.qf.maven</groupId>

  <!-- 項目名稱 -->

  <artifactId>HelloWorld</artifactId>

  <!-- 當前項目版本號:同一個項目開發過程當中能夠發佈多個版本,此處標示0.0.1版 -->

  <!-- 當前項目版本號:每一個工程發佈後能夠發佈多個版本,依賴時調取不一樣的版本,使用不一樣的版本號 -->

  <version>0.0.1</version>

  <!-- 名稱:可省略 -->

  <name>Hello</name>

 

  <!-- 依賴關係 -->

            <dependencies>

                       <!-- 依賴設置 -->

                       <dependency>

                                   <!-- 依賴組織名稱 -->

                                   <groupId>junit</groupId>

                                   <!-- 依賴項目名稱 -->

                                   <artifactId>junit</artifactId>

                                   <!-- 依賴版本名稱 -->

                                   <version>4.9</version>

                                   <!-- 依賴範圍:test包下依賴該設置 -->

                                   <scope>test</scope>

                       </dependency>                  

                      

            </dependencies>

</project>

 

到此maven工程即建立成功。

3.3     Maven的命令

須要在pom.xml所在目錄中執行如下命令。

3.3.1  Mvn compile

執行 mvn compile命令,完成編譯操做

執行完畢後,會生成target目錄,該目錄中存放了編譯後的字節碼文件。

3.3.2  Mvn clean

執行 mvn clean命令

執行完畢後,會將target目錄刪除。

3.3.3  Mvn test

執行 mvn test命令,完成單元測試操做

執行完畢後,會在target目錄中生成三個文件夾:surefire、surefire-reports(測試報告)、test-classes(測試的字節碼文件)

3.3.4  Mvn package

執行 mvn package命令,完成打包操做

執行完畢後,會在target目錄中生成一個文件,該文件多是jar、war

3.3.5  Mvn install

執行 mvn install命令,完成將打好的jar包安裝到本地倉庫的操做

執行完畢後,會在本地倉庫中出現安裝後的jar包,方便其餘工程引用

3.3.6  mvn clean compile命令

cmd 中錄入 mvn clean compile命令

組合指令,先執行clean,再執行compile,一般應用於上線前執行,清除測試類

 

3.3.7  mvn clean test命令

cmd 中錄入 mvn clean test命令

組合指令,先執行clean,再執行test,一般應用於測試環節

 

3.3.8  mvn clean package命令

cmd 中錄入 mvn clean package命令

         組合指令,先執行clean,再執行package,將項目打包,一般應用於發佈前

         執行過程:

                  清理————清空環境

                  編譯————編譯源碼

                  測試————測試源碼

                  打包————將編譯的非測試類打包

3.3.9  mvn clean install命令

cmd 中錄入 mvn clean install 查看倉庫,當前項目被髮布到倉庫中

         組合指令,先執行clean,再執行install,將項目打包,一般應用於發佈前

         執行過程:

                  清理————清空環境

                  編譯————編譯源碼

                  測試————測試源碼

                  打包————將編譯的非測試類打包

                  部署————將打好的包發佈到資源倉庫中

3.4     使用eclipse建立maven工程

widows –》首選項:maven

 

 

3.4.1  經過骨架建立maven工程

3.4.1.1        建立工程

第一步:選擇new→maven→Maven Project

 

第二步:next

第三步:next

選擇maven的工程骨架,這裏咱們選擇quickstart。

第四步:next

輸入GroupId、ArtifactId、Version、Package信息點擊finish完成。

3.4.1.2        MavenFirst.java

在src/main/java中建立com.qf.maven包,而後建立MavenFirst.java

3.4.1.3        建立TestMavenFirst.java

在src/test/java中建立com.qf.maven包,而後建立TestMavenFirst.java

3.4.1.4        執行maven命令進行測試

在Eclipse的maven插件中執行maven命令,須要在maven工程或者pom.xml文件上點擊右鍵,選擇Run as→maven build..

能夠在菜單中看到maven經常使用的命令已經以菜單的形式出現。

例如:

Maven clean

Maven install

Maven package

Maven test

 

Maven build和maven build... 並非maven的命令。

maven build...只是提供一個命令輸入功能,能夠在此功能中輸入自定義的maven命令。

maven build的功能就是執行上次自定義命令。

 

3.4.2  不經過骨架建立maven工程

經過選擇骨架建立maven工程,每次選擇骨架時都須要聯網下載,若是網絡不通或者較慢的狀況下會有很長時間的等待。使用非常不方便,因此建立工程時能夠不選擇骨架直接建立工程。

3.4.2.1        建立工程

第一步:選擇new→maven→Maven Project

第二步:next

 

第三步:next

 

Packaging:指定打包方式,默認爲jar。選項有:jar、war、pom。

第四步:點擊finish,完成maven工程建立。

3.4.2.2        修改pom文件

在Maven-second工程中依賴使用maven-first工程的代碼

4      Maven核心概念

4.1     座標

4.1.1  什麼是座標?

在平面幾何中座標(x,y)能夠標識平面中惟一的一點。在maven中座標就是爲了定位一個惟一肯定的jar包。

Maven世界擁有大量構建,咱們須要找一個用來惟一標識一個構建的統一規範

擁有了統一規範,就能夠把查找工做交給機器

 

4.1.2  Maven座標主要組成

groupId:定義當前Maven組織名稱

artifactId:定義實際項目名稱

version:定義當前項目的當前版本

惟一的表示一個項目

4.2     依賴管理

就是對項目中jar 包的管理。能夠在pom文件中定義jar包的GAV座標,管理依賴。

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

<dependencies>

                  <dependency>

                          <groupId>junit</groupId>

                          <artifactId>junit</artifactId>

                          <version>4.9</version>

                          <scope>test</scope>

                  </dependency>               

         </dependencies>

 

4.2.1  依賴範圍

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

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

2.test:測試依賴範圍。只對於測試classpath有效

3.provided:已提供依賴範圍。對於編譯,測試的classpath都有效,但對於運行無效。由於由容器已經提供,例如servlet-api

4.runtime:運行時提供。例如:jdbc驅動

         <scope>runtime</scope>

4.2.2  依賴傳遞

4.2.2.1        直接依賴和間接依賴

若是B中使用A,C中使用B,則稱B是C的直接依賴,而稱A是C的間接依賴

C->B                  B->A

C直接依賴B

C間接依賴A

4.2.2.2        依賴範圍對傳遞依賴的影響

左邊第一列表示第一直接依賴範圍  aàb

上面第一行表示第二直接依賴範圍  b-->c

中間的交叉單元格表示傳遞性依賴範圍。

總結:

  • 當第二依賴的範圍是compile的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致。
  • 當第二直接依賴的範圍是test的時候,依賴不會得以傳遞。
  • 當第二依賴的範圍是provided的時候,只傳遞第一直接依賴範圍也爲provided的依賴,且傳遞性依賴的範圍一樣爲 provided;
  • 當第二直接依賴的範圍是runtime的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致,但compile例外,此時傳遞的依賴範圍爲runtime;
  • 若是直接與間接依賴中包含有同一個座標不一樣版本的資源依賴,以直接依賴的版本爲準(就近原則)
  • a<---b   junit 3.9
  • bß-c   junit 4.1

4.2.3  依賴衝突

  • 若是直接與間接依賴中包含有同一個座標不一樣版本的資源依賴,以直接依賴的版本爲準(就近原則)
  • a<---b   junit 3.9
  • b<--c   junit 4.1

一、Maven-first工程中依賴log4j-1.2.8版本

那麼maven-third中依賴的就是log4j-1.2.8

二、maven-second工程中依賴log4j-1.2.9版本

那麼maven-third中依賴的就是log4j-1.2.9,由於它直接依賴的maven-second項目中依賴的就是1.2.9版本

  • 若是直接依賴中包含有同一個座標不一樣版本的資源依賴,以配置順序下方的版本爲準(就近原則)

Maven-second中依賴 log4j-1.2.9 和 log4j-1.2.14

 

 

此時log4j-1.2.14版本生效。

 

4.2.4  可選依賴

<optional> true/false 是否可選,也能夠理解爲是否向下傳遞。

在依賴中添加optional選項決定此依賴是否向下傳遞,

若是是true則不傳遞,若是是false就傳遞,默認爲false。

4.2.5  排除依賴

ThirdMaven  SecondMaven  FirstMaven

<exclusions

    <exclusion>

       <groupId>com.qf.maven</groupId>

       <artifactId>maven-first</artifactId>

    </exclusion>

</exclusions>

 

排除依賴包中所包含的依賴關係,不須要添加版本號

若是在本次依賴中有一些多餘的jar包也被傳遞依賴過來,若是想把這些jar包排除的話能夠配置exclusions進行排除。

4.3     生命週期

4.3.1  什麼是生命週期?

Maven生命週期就是爲了對全部的構建過程進行抽象和統一

包括項目清理、初始化、編譯、打包、測試、部署等幾乎全部構建步驟。

生命週期能夠理解爲構建工程的步驟。

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

 Clean Lifecycle: 在進行真正的構建以前進行一些清理工做。

 Default Lifecycle: 構建的核心部分,編譯,測試,打包,部署等等。

 Site Lifecycle: 生成項目報告,站點,發佈站點。  ProjectManager

再次強調一下它們是相互獨立的,你能夠僅僅調用clean來清理工做目錄,僅僅調用site來生成站點。固然你也能夠直接運行 mvn clean install site 運行全部這三套生命週期。

4.3.2  Maven三大生命週期

4.3.2.1        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很重要的一個規則,能夠大大簡化命令行的輸入。

4.3.2.2        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的生命週期的,所以理解生命週期相當重要。

4.3.2.3     site:生成項目站點

Site生命週期

pre-site 執行一些須要在生成站點文檔以前完成的工做

site 生成項目的站點文檔

post-site 執行一些須要在生成站點文檔以後完成的工做,而且爲部署作準備

site-deploy 將生成的站點文檔部署到特定的服務器上

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

4.4     Maven插件

Maven的核心僅僅定義了抽象的生命週期,具體的任務都是交由插件完成的。每一個插件都能實現一個功能,每一個功能就是一個插件目標。Maven的生命週期與插件目標相互綁定,以完成某個具體的構建任務。

例如compile就是插件maven-compiler-plugin的一個插件目標

4.4.1  Maven編譯插件

<plugin>

         <groupId>org.apache.maven.plugins</groupId>

         <artifactId>maven-compiler-plugin</artifactId>

         <configuration>

                  <source>1.7</source>

                  <target>1.7</target>

                  <encoding>UTF-8</encoding>

         </configuration>

</plugin>

 

 

Maven-tomcat插件:

  <build>

    <finalName>HelloMaven4_web</finalName>

      <!-- 插件 -->

         <plugins>

             <plugin> 

               <groupId>org.apache.tomcat.maven</groupId> 

               <artifactId>tomcat7-maven-plugin</artifactId> 

               <version>2.2 </version> 

                   <configuration> 

                      <url>http://localhost:8080/HelloMaven4_web</url> 

                      <server>tomcat</server> 

                  </configuration> 

              </plugin>

         </plugins>

  </build>

 

修改配置文件後,在工程上點擊右鍵選擇maven→update project configration

4.4.2  Tomcat插件

4.4.2.1        使用maven建立一個web工程

第一步:不選用骨架

第二步:將打包方式選擇爲war

第三步:點擊finish,工程建立成功。

第四步:在工程中添加web.xml

 

Web.xml內容以下:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

    id="WebApp_ID" version="2.5">

    <welcome-file-list>

       <welcome-file>index.html</welcome-file>

       <welcome-file>index.htm</welcome-file>

       <welcome-file>index.jsp</welcome-file>

       <welcome-file>default.html</welcome-file>

       <welcome-file>default.htm</welcome-file>

       <welcome-file>default.jsp</welcome-file>

    </welcome-file-list>

</web-app>

第五步:在webapp下建立index.jsp

注意:建立了一個web工程,可是沒有生成web.xml 啓動時,就會報錯,你要手動添加嗎? 使用eclipse的同窗都知道右鍵 選擇JavaEE Tools來建立web.xml那麼idea呢?

 第一步:點擊file,選擇projectStructure

  第二步:選擇facets,選擇web-》web項目名 點擊+web.xml

相關文章
相關標籤/搜索