Maven學(xué)習(xí)筆記


Maven概述

  • Maven定義

    • Maven是一個項目管理和整合,統(tǒng)一管理jar包的工具;
    • Maven為開發(fā)者提供了一套完整的構(gòu)建生命周期框架,可以讓開發(fā)團(tuán)隊快速完成工程的基礎(chǔ)構(gòu)建配置,因為Maven使用了標(biāo)準(zhǔn)的目錄結(jié)構(gòu)和默認(rèn)的生命周期;
    • Maven能夠幫助開發(fā)者完成構(gòu)建、文檔生成、報告、依賴、SCMs、發(fā)布、分發(fā)和郵件列表;
  • 總結(jié)

    • Maven簡化了工程的構(gòu)建過程,并對其標(biāo)準(zhǔn)化;
    • 銜接了編譯、發(fā)布、文檔生成、團(tuán)隊合作和其他;
    • Maven提高了重用性,負(fù)責(zé)大部分構(gòu)建任務(wù);
  • Maven歷史
    Maven最初是在Jakarta-Turbine項目中為了簡化構(gòu)建過程而設(shè)計的。項目中有幾個子工程,每個工程包含稍有不同的 ANT 文件。JAR 文件使用 CVS 管理。
    Apache 小組隨后開發(fā)了Maven,能夠同時構(gòu)建多個工程、發(fā)布工程信息、部署工程、在幾個工程中共享 JAR 文件,并且協(xié)助團(tuán)隊合作。

  • Maven目的

    • 主要是為開發(fā)這提供一個可復(fù)用、可維護(hù)、更易理解的工程綜合模型
    • 以及與這個模型交互的插件或者工具
  • Maven宗旨
    始終貫徹一句話:約定優(yōu)于配置
    開發(fā)者不需要關(guān)心每一個配置細(xì)節(jié)。當(dāng)創(chuàng)建Maven工程時,Maven會創(chuàng)建默認(rèn)的工程結(jié)構(gòu),開發(fā)者只需要合理防止文件,在pom.xml中不需要再定義任何配置;

例如: Maven工程的默認(rèn)結(jié)構(gòu)(假定${basedir}表示工程目錄)

配置項 默認(rèn)值
源代碼 ${basedir}/src/main/java
配置文件 ${basedir}/src/main/resources
測試文件 ${basedir}/src/test
打包的jar包 ${basedir}/target
編譯后的文件(字節(jié)碼文件) ${basedir}/target/classes

Maven環(huán)境配置

  • 系統(tǒng)要求
項目 要求
JDK Maven3.3要求JDK1.7或以上
Maven3.2要求JDK1.6或以上
Maven3.0/3.1要求JDK1.5或以上
內(nèi)存 沒有最低要求
磁盤 Maven自身安裝大約10MB空間,除此之外,都是用來存放本地倉庫的jar包,預(yù)期至少500MB
操作系統(tǒng) 沒有最低要求
  • 配置步驟
  1. 檢查Java安裝(JDK)
    打開操作系統(tǒng)的命令行,然后輸入命令:java -version
  2. Java環(huán)境配置
操作系統(tǒng) 設(shè)置
Windows 環(huán)境變量 JAVA_HOME = Java的JDK安裝目錄,然后將JAVA_HOME添加到系統(tǒng)的環(huán)境變量Path后面
Linux export JAVA_HOME=/usr/local/java-current,然后export PATH=PATH:JAVA_HOME/bin/
Mac export JAVA_HOME=/Library/Java/Home
  1. 下載Maven文件
    http://maven.apache.org/download.html下載Maven3.2.5
  2. 解壓并配置Maven環(huán)境變量
    解壓文件,安裝Maven3.2.5得到子目錄apache-maven-3.2.5
操作系統(tǒng) 設(shè)置
Windows 使用系統(tǒng)屬性設(shè)置環(huán)境變量
M2_HOME=C:\dictionary\apache-maven-3.2.5
M2=%M2_HOME%\bin
MAVEN_OPTS=-Xms256m -Xmx512m,然后添加“;%M2%”到Path變量后面
Linux 打開命令行設(shè)置環(huán)境變量
export M2_HOME=/usr/local/apache-maven/apache-maven-3.2.5
export M2=$M2_HOME/bin
export MAVEN_OPTS=-Xms256m -Xmx512m
最后export PATH=M2:PATH
Mac 打開命令行設(shè)置環(huán)境變量
export M2_HOME=/usr/local/apache-maven/apache-maven-3.2.5
export M2=$M2_HOME/bin
export MAVEN_OPTS=-Xms256m -Xmx512m
最后export PATH=M2:PATH
  1. 驗證Maven安裝
    打開操作系統(tǒng)的命令行,然后輸入命令:mvn -version

Maven倉庫

  • 定義
    Maven倉庫:倉庫是一個位置,可以存儲所有工程的jar文件,library jar文件,插件或者其他工程指定的文件;
  • 類型
    • 本地倉庫
      • Maven本地倉庫是本地機(jī)器上的一個文件夾,在第一次運(yùn)行任何maven命令的時候創(chuàng)建;
      • 本地倉庫在運(yùn)行maven構(gòu)建后,會自動下載并保存工程中需要的所有依賴、插件等到本地倉庫中,避免每次構(gòu)建都需要去遠(yuǎn)程倉庫引用;
      • 本地倉庫的默認(rèn)路徑在User/用戶名/.m2下,如果需要重新定義位置,可以在settings.xml文件中的localRepository標(biāo)簽中定義新的存放位置;
    • 中央倉庫
      • 由Maven社區(qū)提供的倉庫,包含了大量常用的庫;
      • 這個倉庫由Maven社區(qū)管理;
      • 不需要用戶手動配置;
      • 需要通過網(wǎng)絡(luò)才能訪問;
      • 搜索Maven中央倉庫的jar包依賴:http://search.maven.org/#browse
    • 遠(yuǎn)程倉庫
      • 遠(yuǎn)程倉庫是為了解決Maven在中央倉庫找不到依賴的庫文件而停止構(gòu)建并報錯這種情況;
      • 遠(yuǎn)程倉庫是開發(fā)人員你自己定制的倉庫,包含了自己需要的代碼或者其他項目需要的jar文件;

構(gòu)建配置文件

  • 定義
  1. 構(gòu)建配置文件是一組配置的集合,用來設(shè)置或者覆蓋Maven構(gòu)建的默認(rèn)配置,使用構(gòu)建配置文件,可以為不同的環(huán)境定制構(gòu)建過程,例如pro和dev環(huán)境。
  2. Profile在pom.xml中使用activeProfiles/profiles元素指定,而且可以用多種方式觸發(fā),Profile在構(gòu)建時修改POM,并且為變量設(shè)置不同的目標(biāo)環(huán)境,例如日志環(huán)境,kafka環(huán)境。
  • Profile
    • Profile類型

      類型 使用
      Pre Project 定義在POM文件的pom.xml中
      Per User 定義在Maven設(shè)置xml文件中(%USER_HOME%/.m2/settings.xml)
      Global 定義在Maven全局配置xml文件中(%USER_HOME%/conf/settings.xml)
    • Profile激活方法

    1. 顯式使用命令控制臺輸入
    2. 通過maven設(shè)置
    3. 基于環(huán)境變量(用戶/系統(tǒng)變量)
    4. 操作系統(tǒng)配置
    5. 現(xiàn)存/缺失文件

Maven POM

  • POM前言
    定義:

    1. POM代表工程對象模型,是使用Maven工作的基本組件,是一個xml文件,被放在工程根目錄下,命名為pom.xml;
    2. POM包含了工程和各種配置細(xì)節(jié)的信息;
    3. POM也包含了目標(biāo)和插件;

    注意:

    1. 每個工程只有一個POM文件;
    2. 所有的POM文件需要根元素(project元素)和三個必須字段:groupId,artifactId,version;
    3. 在倉庫中的工程標(biāo)識為:groupId:artifactId:version;
  • POM用途

    • pom.xml用來定義Maven工程結(jié)構(gòu)和內(nèi)容,是Project Object Model的簡稱;
    • pom.xml是整個Maven系統(tǒng)的基礎(chǔ)組件;
  • POM配置詳解

    • POM配置組成

      1. POM的模型版本:modelVersion標(biāo)簽,在Maven2和Maven3中,只支持4.0.0版本

      2. 基本配置

      配置名稱 描述
      dependencies 項目引用插件所需要的額外的依賴
      groupId 項目組ID
      artifactId 構(gòu)件的標(biāo)識符,它和groupId一起唯一標(biāo)識一個構(gòu)件
      version 項目版本
      packaging 項目打包方式,例如jar、war、ear、pom
      parent 引用的父項目
      modules 引用的模塊
      properties 自定義的各種必要屬性,在文件中可以使用${屬性名}來引用
      1. build配置
      配置名稱 描述
      build 構(gòu)建項目需要的信息,主要標(biāo)簽:Resources(用于排除或者包含一些資源文件)和Plugins(設(shè)置構(gòu)建的插件)
      reporting 使用報表插件產(chǎn)生的報表規(guī)范,當(dāng)用戶執(zhí)行“mvn site”,這些報表就會運(yùn)行
      1. 項目信息配置
      配置名稱 描述
      issueManagement 給出defect tracking system及其訪問URL
      ciManagement 給出Continuous Integration Management、其URL和notifier(集成過程中發(fā)生事件,以某種方式(如mail)通知開發(fā)人員)
      scm(software configuration management) connection、developerConnection、tag、url
      distributionManagement 構(gòu)件的發(fā)布管理
      prerequisites POM執(zhí)行的前提條件,目前只支持對Maven版本的要求
      mailingLists 開發(fā)人員或用戶的郵件列表(name、subscribe、unsubscribe、post、archive、otherArchives)
      1. 環(huán)境配置
      配置名稱 描述
      name 項目的名稱代號
      description 項目說明
      url 項目官網(wǎng)url
      inceptionYear 項目開發(fā)年份
      licenses 可以包含多個license,以及子屬性:name(license名稱)、url(license可訪問的url地址)、distribution(license發(fā)布方式)、comments(license說明)
      organization 包含組織的name,組織的官網(wǎng)url
      developers developer中包含id、name、email、url、organization、organizationUrl、roles、timezone、properties
      contributors contributor包含除了id之外的所有developer屬性
    • POM元素繼承
      元素繼承的原因:為了減少重復(fù)代碼的編寫,需要創(chuàng)建POM的父子結(jié)構(gòu),在父POM中申明一些供子POM繼承的配置,實現(xiàn)“一處申明,多處使用”。

可繼承的POM元素:

  1. groupId:項目組ID,項目坐標(biāo)的核心元素
  2. version:項目版本,項目坐標(biāo)的核心因素
  3. description:項目的描述信息
  4. organization:項目的組織信息
  5. inceptionYear:項目的創(chuàng)始年份
  6. url:項目的URL地址
  7. developers:項目的開發(fā)者信息
  8. contributors:項目的貢獻(xiàn)者信息
  9. distributionManagement:項目的部署配置
  10. issueManagement:項目的缺陷跟蹤系統(tǒng)信息
  11. ciManagement:項目的持續(xù)集成系統(tǒng)信息
  12. scm:項目的版本控制系統(tǒng)西溪
  13. malilingLists:項目的郵件列表信息
  14. properties:自定義的Maven屬性
  15. dependencies:項目的依賴配置
  16. dependencyManagement:項目的依賴管理配置
  17. repositories:項目的倉庫配置
  18. build:包括項目的源碼目錄配置、輸出目錄配置、插件配置、插件管理配置等
  19. reporting:包括項目的報告輸出目錄配置、報告插件配置等
  • 聚合與繼承的關(guān)系

    • 區(qū)別
      1. 聚合模塊知道那些被聚合的模塊,但被聚合的模塊不知道聚合模塊的存在;
      2. 對于繼承關(guān)系的父POM來說,不知道繼承的字模塊有哪些,但是字模塊必須知道自己的父POM是什么。
    • 共同點(diǎn)
      1. 聚合POM與繼承關(guān)系中的父POM的packaging都是pom;
      2. 聚合模塊與繼承關(guān)系中的父模塊除了POM之外都沒有實際內(nèi)容。
  • 依賴管理
    依賴是使用Maven坐標(biāo)來定位的,而Maven坐標(biāo)主要由GAV(groupId, artifactId, version)構(gòu)成。
    在實際項目中,會存在pom文件,這時,如果不進(jìn)行依賴管理,則會出現(xiàn)同一個依賴模塊可能在不同的pom中都會出現(xiàn),這就造成了重復(fù)依賴,在Maven中消除這種重復(fù)依賴的正確做法是:
    1.在父模塊中使用dependencyManagement配置依賴;
    2.在子模塊中使用dependencies添加依賴;
    dependencyManagement實際上不會真正引入任何依賴,dependencies才會。但是,當(dāng)父模塊中配置了某個依賴之后,子模塊只需使用簡單groupId和artifactId就能自動繼承相應(yīng)的父模塊依賴配置。

    • 依賴歸類
      依賴歸類主要體現(xiàn)在依賴groupId相同的jar包的版本控制,例如依賴了spring相關(guān)jar包,spring-context、spring-core,要保證版本號相同,版本號不同,有時會出現(xiàn)兼容性問題。解決方法是在pom.xml中定義:

      <properties>  
        <spring.version>2.5</spring.version>  
      </properties>
      
      <dependencies>  
        <dependency>  
          <groupId>org.spring.framework</groupId>  
          <artifactId>spring-core</artifactId>  
          <version>${spring.version}</version>  
        </dependency> 
        <dependency>  
          <groupId>org.spring.framework</groupId>  
          <artifactId>spring-context</artifactId>  
          <version>${spring.version}</version>  
        </dependency>
      </dependencies>
      
    • 依賴范圍

      作用域變量名 編譯時有效 測試時有效 運(yùn)行時有效 示例
      compile smart-framework.jar(默認(rèn))
      test -- -- junit.jar
      runtime -- mysql-connector-java.jar
      provided -- servlet-api.jar
      system -- JDK的rt.jar
    • 分類器
      分類器的命名模式為:artifactId-version-classifier.packaging
      例如:

      <dependency>  
        <groupId>org.testng</groupId>  
        <artifactId>testng</artifactId>  
        <version>5.7</version>  
        <classifier>jdk15</classifier>  
      </dependency>
      

    分類器的用途:用來聲明對test構(gòu)件的依賴,比如我們在核心模塊中聲明了一些基礎(chǔ)類,結(jié)果發(fā)現(xiàn)這個基礎(chǔ)類對其他模塊的測試類都有用,我們就可以把這個基礎(chǔ)類打包成artifactId-version-test.jar,例如:

    <dependency>  
        <groupId>org.myorg.myapp</groupId>  
        <artifactId>core</artifactId>  
        <version>${project.version}</version>  
        <classifier>test</classifier>  
    </dependency>
    

生命周期

Maven強(qiáng)大的一個重要的原因是它有一個十分完善的生命周期模型(lifecycle),這個生命周期可以從兩方面來理解:

  1. 顧名思義,運(yùn)行Maven的每個步驟都由它來定義的,這種預(yù)定義的默認(rèn)行為使得我們使用Maven變得簡單,相比而言,Ant的每個步驟都要你手工去定義;
  2. 這個模型是一種標(biāo)準(zhǔn),在不同的項目中,使用Maven的接口是一樣的,這樣就不用去仔細(xì)理解每個項目的構(gòu)建了,一般情況下,mvn clean install 這樣的命令是通用的。

Maven有三套、相互獨(dú)立的生命周期

生命周期 描述
clean 在進(jìn)行真正構(gòu)建之前作一些清理工作
default(or build) 構(gòu)建的核心部分,編譯、測試、打包、部署等等
site 用來生成項目報告、站點(diǎn)、發(fā)布站點(diǎn)

注意:你可以僅僅調(diào)用clean來清理工作目錄,也可以僅僅調(diào)用site來生成站點(diǎn),也可以直接使用mvn clean install site完成這一套生命周期。

clean
當(dāng)運(yùn)行mvn clean時,clean生命周期一共包含了三個階段:

階段名稱 描述
pre-clean 執(zhí)行一些需要在clean之前完成的工作
clean 移除所有上一次構(gòu)建生成的文件
post-clean 執(zhí)行一些需要在clean之后立刻完成的工作

注意:mvn clean 中的clean就是上面的clean,在一個生命周期中,運(yùn)行某個階段的時候,它之前的所有階段都會被運(yùn)行,也就是說,mvn clean 等同于 mvn pre-clean clean ,如果我們運(yùn)行 mvn post-clean ,那么 pre-clean,clean 都會被運(yùn)行。

site

階段名稱 描述
pre-site 執(zhí)行一些要在生成項目站點(diǎn)文檔前完成的工作
site 生成項目的站點(diǎn)文檔
post-site 執(zhí)行一些需要在生成站點(diǎn)文檔之后完成的工作,并且為部署做準(zhǔn)備
site-deploy 將生成的站點(diǎn)文檔部署到特定的服務(wù)器上

經(jīng)常會用到site階段和site-deploy階段,用以生成和發(fā)布Maven站點(diǎn),完成文檔和統(tǒng)計數(shù)據(jù)自動生成。

default(or build)

階段名稱 描述
validate 檢查工程配置是否正確,完成構(gòu)建過程的所有必要信息是否能夠獲取到
initialize 初始化構(gòu)建狀態(tài),例如設(shè)置屬性
generate-sources 生成編譯階段需要包含的任何源碼文件
process-sources 處理源代碼,例如過濾任何值
generate-resources 生成工程包中需要包含的資源文件
process-resources 拷貝和處理資源文件到目的目錄中,為打包階段做準(zhǔn)備
compile 編譯工程源碼
process-classes 處理編譯生成的文件,例如Java Class 字節(jié)碼的加強(qiáng)和優(yōu)化
generate-test-sources 生成編譯階段需要包含的任何測試源代碼
process-test-sources 處理測試源代碼,例如過濾任何值
test-compile 編譯測試源代碼到測試目錄
process-test-classes 處理測試代碼文件編譯后生成的文件
test 使用適當(dāng)?shù)膯卧獪y試框架(例如JUnit)運(yùn)行測試
prepare-package 在真正打包之前,為準(zhǔn)備打包執(zhí)行任何必要的操作
package 獲取編譯后的代碼,并按照可發(fā)布的格式進(jìn)行打包,例如JAR、WAR或者EAR文件
pre-integration-test 在集成測試執(zhí)行之前,執(zhí)行所需的操作。例如設(shè)置所需的環(huán)境變量
integration-test 處理和部署必須的工程包到集成測試能夠運(yùn)行的環(huán)境中
post-integration-test 在集成測試被執(zhí)行后執(zhí)行必要的操作。例如清理環(huán)境
verify 運(yùn)行檢查操作來驗證工程包是有效的,并滿足質(zhì)量要求
install 安裝工程包到本地倉庫中,該倉庫可以作為本地其他工程的依賴
deploy 拷貝最終的工程包到遠(yuǎn)程倉庫中,以共享給其他開發(fā)人員和工程

注意:運(yùn)行任何一個階段,它前面的所有階段都會被運(yùn)行,這就是當(dāng)我們運(yùn)行mvn install時,代碼會被編譯、測試、打包的原因;而且,Maven的插件機(jī)制是完全依賴Maven的生命周期的。

Maven插件

  • 插件和生命周期
    使用mvn clean install構(gòu)建Maven項目時:

    生命周期階段 插件
    clean clean插件
    compile compile插件
    process-test-resources resources插件
    test-compile compiler插件
    test surefire插件
    package war/jar插件
    install install插件
  • 插件配置
    有一個compiler常用的配置,因為compiler插件默認(rèn)使用的是Java1.4的標(biāo)準(zhǔn)來編譯源代碼的,如果代碼中用到了Java1.5的新特性,這樣就會編譯報錯,所以要進(jìn)行配置compiler插件支持Java 1.5;

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

Maven版本管理

  • 定義

    • 版本管理不是指的版本控制,版本指的是artifact的版本,而不是指源碼的版本;
    • 版本號我們可以通過修改pom中version之后,在構(gòu)建一次就能改變,但是這樣修改當(dāng)我們同一個項目中有多個模塊,這樣改就會很麻煩;所以我們要了解如何自動化發(fā)布版本;
  • SNASHOT
    SNAPSHOT是不穩(wěn)定版本,還在開發(fā)中,每天都會提交新的代碼,會頻繁地發(fā)布新的版本;

  • RELEASE
    RELEASE是一段時間內(nèi)的穩(wěn)定版本,經(jīng)過了多個SNAPSHOT版本;

  • Maven版本規(guī)則
    規(guī)則:<主版本>.<次版本>.<增量版本>;
    主版本一般都是項目發(fā)生了大的架構(gòu)變更;
    此版本一般只是增加了一些功能,或者原有功能的修改;
    增量版本則是修改的一些輕微的bug;

  • 相關(guān)插件
    maven-release-plugin,這個插件會幫助我們升級pom版本,提交,打tag,然后再升級版本,再提交,等等,使用方法:

    <distributionManagement>
        <snapshotRepository>
            <id>nexus-snapshots</id>
            <name>Project SNAPSHOTS</name>
            <url>http://nexus.ops.7mxing.com/repository/maven-snapshots/</url>
        </snapshotRepository>
        <repository>
            <id>nexus-releases</id>
            <name>Project Release</name>
            <url>http://nexus.ops.7mxing.com/repository/maven-releases/</url>
        </repository>
    </distributionManagement>
    
    <!-- 發(fā)布插件 -->
    <plugin>  
      <groupId>org.apache.maven.plugins</groupId>  
      <artifactId>maven-release-plugin</artifactId>  
      <version>xxx</version> 
    </plugin> 
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 簡介 概述 Maven 是一個項目管理和整合工具 Maven 為開發(fā)者提供了一套完整的構(gòu)建生命周期框架 Maven...
    閩越布衣閱讀 4,544評論 6 39
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,694評論 19 139
  • 閱讀《Maven實戰(zhàn)》許曉斌的一些筆記,便于自己和道友查閱 maven依賴 maven具有傳遞性依賴,比如 A 依...
    tenlee閱讀 591評論 0 0
  • |-1-更新內(nèi)容[6.從倉庫解析依賴的機(jī)制(重要)] 1Maven倉庫作用 倉庫用來存儲所有項目使用到構(gòu)件,在ma...
    zlcook閱讀 6,467評論 0 25
  • 生活在這世上的每一天里,有不盡人意的悲歡離合,也有不經(jīng)意間發(fā)生著的小確幸。當(dāng)遇到挫折、困惑、抑郁和悲痛時,能緩解壞...
    收了納個Queen閱讀 1,103評論 0 1

友情鏈接更多精彩內(nèi)容