1. 程式人生 > >maven詳解3

maven詳解3

本文轉:http://blog.csdn.net/u010425776/article/details/52027706

什麼是Maven?

如今我們構建一個專案需要用到很多第三方的類庫,如寫一個使用spring的Web專案就需要引入大量的jar包。一個專案Jar包的數量之多往往讓我們瞠目結舌,並且Jar包之間的關係錯綜複雜,一個Jar包往往又會引用其他Jar包,缺少任何一個Jar包都會導致專案編譯失敗。 
以往開發專案時,程式設計師往往需要花較多的精力在引用Jar包搭建專案環境上,而這一項工作尤為艱難,少一個Jar包、多一個Jar包往往會報一些讓人摸不著頭腦的異常。 
而Maven就是一款幫助程式設計師構建專案的工具,我們只需要告訴Maven需要哪些Jar 包,它會幫助我們下載所有的Jar,極大提升開發效率。

安裝Maven 和 Maven的Eclipse外掛

Maven規定的目錄結構

若要使用Maven,那麼專案的目錄結構必須符合Maven的規範,其目錄結構如下: 
title

Maven基本命令

  1. -v:查詢Maven版本 
    本命令用於檢查maven是否安裝成功。 
    Maven安裝完成之後,在命令列輸入mvn -v,若出現maven資訊,則說明安裝成功。

  2. compile:編譯 
    Java原始檔編譯成class檔案

  3. test:測試專案 
    執行test目錄下的測試用例

  4. package:打包 
    將專案打成jar包

  5. clean:刪除target資料夾

  6. install:安裝 
    將當前專案放到Maven的本地倉庫中。供其他專案使用

什麼是Maven倉庫?

Maven倉庫用來存放Maven管理的所有Jar包。分為:本地倉庫 和 中央倉庫。

  • 本地倉庫 
    Maven本地的Jar包倉庫。
  • 中央倉庫 
    Maven官方提供的遠端倉庫。

當專案編譯時,Maven首先從本地倉庫中尋找專案所需的Jar包,若本地倉庫沒有,再到Maven的中央倉庫下載所需Jar包。

什麼是“座標”?

在Maven中,座標是Jar包的唯一標識,Maven通過座標在倉庫中找到專案所需的Jar包。 
如下程式碼中,groupId和artifactId構成了一個Jar包的座標。

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.1</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • groupId:所需Jar包的專案名
  • artifactId:所需Jar包的模組名
  • version:所需Jar包的版本號

傳遞依賴 與 排除依賴

  • 傳遞依賴:如果我們的專案引用了一個Jar包,而該Jar包又引用了其他Jar包,那麼在預設情況下專案編譯時,Maven會把直接引用和簡潔引用的Jar包都下載到本地。
  • 排除依賴:如果我們只想下載直接引用的Jar包,那麼需要在pom.xml中做如下配置:(將需要排除的Jar包的座標寫在中)
<exclusions>
    <exclusion>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
    </exclusion>
</exclusions>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

依賴衝突

若專案中多個Jar同時引用了相同的Jar時,會產生依賴衝突,但Maven採用了兩種避免衝突的策略,因此在Maven中是不存在依賴衝突的。

  • 短路優先
本專案——>A.jar——>B.jar——>X.jar
本專案——>C.jar——>X.jar
  • 1
  • 2
  • 1
  • 2

若本專案引用了A.jar,A.jar又引用了B.jar,B.jar又引用了X.jar,並且C.jar也引用了X.jar。 
在此時,Maven只會引用引用路徑最短的Jar。

  • 宣告優先 
    若引用路徑長度相同時,在pom.xml中誰先被宣告,就使用誰。

聚合

  1. 什麼是聚合? 
    將多個專案同時執行就稱為聚合。

  2. 如何實現聚合? 
    只需在pom中作如下配置即可實現聚合:

    <modules>
        <module>../模組1</module>
        <module>../模組2</module>
        <module>../模組3</module>
    </modules>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

繼承

  1. 什麼是繼承? 
    在聚合多個專案時,如果這些被聚合的專案中需要引入相同的Jar,那麼可以將這些Jar寫入父pom中,各個子專案繼承該pom即可。

  2. 如何實現繼承?

    • 父pom配置:將需要繼承的Jar包的座標放入標籤即可。
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-spring</artifactId>
                <version>1.2.2</version>
            </dependency> 
        </dependencies>
    </dependencyManagement>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 子pom配置:
<parent>
    <groupId>父pom所在專案的groupId</groupId>
    <artifactId>父pom所在專案的artifactId</artifactId>
    <version>父pom所在專案的版本號</version>
</parent>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

使用Maven構建Web專案

  1. New Maven專案:選擇WebApp: 
    title

  2. 若使用JSP,需新增Servlet依賴: 
    注:Servlet依賴只在編譯和測試時使用!

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <!-- 只在編譯和測試時執行 -->
    <scope>provided</scope>
</dependency> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. 在Bulid Path中設定resource輸出目錄: 
    title

  2. 勾選:Dynamic Web Module 
    title

  3. 刪掉測試目錄 
    title

  4. 在pom中加入jetty的外掛,並設定JDK版本:

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>9.3.10.v20160621</version>
            <executions>
                <execution>
                    <phase>package</phase>
                </execution>
            </executions>
        </plugin>
    </plugins>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  1. 執行專案: 
    title

  2. 輸入:jetty:run 
    title

  3. 訪問127.0.0.1:8080 
    若出現如下介面,表示成功! 
    title

pom.xml詳解

pom.xml是Maven的核心,你的專案需要什麼Jar包就在pom.xml裡面配置。當編譯專案時Maven讀取該檔案,並從倉庫中下載相應的Jar包。

<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>cn.erhuowang</groupId>     
    <!-- 構件的識別符號,它和group ID一起唯一標識一個構件。換句話說,你不能有兩個不同的專案擁有同樣的artifact ID和groupID;在某個 特定的group ID下,artifact ID也必須是唯一的。構件是專案產生的或使用的一個東西,Maven為專案產生的構件包括:JARs,源 碼,二進位制釋出和WARs等。-->     
    <artifactId>erhuowang-maven2</artifactId>     
    <!--專案產生的構件型別,例如jar、war、ear、pom。外掛可以建立他們自己的構件型別,所以前面列的不是全部構件型別-->     
    <packaging>war</packaging>     
    <!--專案當前版本,格式為:主版本.次版本.增量版本-限定版本號-->     
    <version>1.0-SNAPSHOT</version>     
    <!--專案的名稱, Maven產生的文件用-->     
    <name>erhuo-maven</name>     
    <!--專案主頁的URL, Maven產生的文件用-->     
    <url>http://erhuowang.cn</url>     
    <!-- 專案的詳細描述, Maven 產生的文件用。  當這個元素能夠用HTML格式描述時(例如,CDATA中的文字會被解析器忽略,就可以包含HTML標 籤), 不鼓勵使用純文字描述。如果你需要修改產生的web站點的索引頁面,你應該修改你自己的索引頁檔案,而不是調整這裡的文件。-->     
    <description>A maven project to study maven.</description>     
    <!--描述了這個專案構建環境中的前提條件。-->    
 <prerequisites>    
  <!--構建該專案或使用該外掛所需要的Maven的最低版本-->    
    <maven/>    
 </prerequisites>    
 <!--專案名稱和URL-->     
    <issueManagement>    
     <!--專案名字,-->     
        <system>erhuowang</system>     
        <!--該專案使用的URL-->    
        <url>http://erhuowang.cn</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-->