1. 程式人生 > >Maven核心知識

Maven核心知識

生成 生命周期 包含 利用 archetype junit files groups optional

1.maven常用的構建命令

(1)mvn -v     查看maven版本

(2)compile    編譯

(3)test      測試

(4)package    打包

(5)clean     刪除target

(6)install     安裝jar包到本地倉庫中

2.maven自動建立目錄骨架

(1)archetype插件

  • 用於創建符合maven規定的目錄骨架
  • 先創建一個文件夾,其名為project名

(2)自動創建目錄方式一

  • win+R,cmd,cd到該文件夾路徑下,輸入mvn archetype:generate,enter,第一次會自動下載一些相關依賴
  • enter,輸入6
    • ‘groupId‘ 輸入com.gc.maven;
    • ‘artifactId‘輸入maven-service;
    • ‘version‘輸入1.0.0SNAPSHOT;
    • ‘package‘輸入com.gc.maven.service,
    • enter,輸入y
  • 至此自動創建成功
  • 這是按照提示進行選擇的方法

(3)自動創建目錄方式二

  • win+R,cmd,cd到該文件夾路徑下
  • 輸入mvn archetype:generate -DgroupId=組織名,公司網址的反寫+項目名 -DartifactId=項目名-模塊名 -Dversion=版本號 -Dpackage=代碼所存在的包名

3.maven中的坐標和倉庫

(1)坐標

  • 構件通過坐標作為其唯一標識
  • groupId,artifactId,version組成項目的基本坐標

(2)倉庫

  • 倉庫管理項目的依賴
  • 本地倉庫和遠程倉庫:打開maven—>lib—>maven-model-builder-3.5.4.jar,用360壓縮打開,org—>apache—>maven—>model—>pom-4.0.0.xml,打開,找到<url>https://repo.maven.apache.org/maven2</url>,即為遠程倉庫
  • 鏡像倉庫:打開maven—>conf—>settings.xml,找到mirrors,配置1-2個鏡像     
   <mirror>
      <id
>jboss-public-repository-group</id> <mirrorOf>central</mirrorOf> <name>JBoss Public Repository Group</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror>
  • 更改倉庫位置:默認本地倉庫在c盤中C:\Users\guochan\.m2,如果重裝系統可能丟失,所以要更改倉庫位置
    • 創建一個本地文件夾其路徑為E:\maven\repo,打開maven—>conf—>settings.xml,找到localRepository,
    • <localRepository>E:/maven-3.5.0/repository</localRepository>
    • win+R cmd ,輸入命令mvn compile測試是否成功

4.在Intellij IDEA中配置maven以及創建maven項目

(1)配置maven

  • Ctrl+Shift+A,輸入maven,選擇maven settings
  • 在maven home directory中選擇maven文件夾目錄,我這裏是D:/Program Files (x86)/apache-maven-3.5.4-bin/apache-maven-3.5.4
  • 在user setting file中選擇override,填入修改好本地倉庫位置的配置文件,我這裏是D:\Program Files (x86)\apache-maven-3.5.4-bin\apache-maven-3.5.4\conf\settings.xml
  • local repository會自動檢測到修改過的本地倉庫路徑
  • 在settings搜索框中輸入runner,找到maven下的runner,在VM Options中輸入-DarchetypeCatalog=internal,如果未配置會導致maven 骨架生成速度緩慢
  • 配置完成
  • File—>other settings—>default settings,再將剛才配置一遍,在創建maven項目的時候就不用重復配置了

(2)創建maven web項目

  • File—>New—>Project,選擇maven,在create from archetype打勾,選擇技術分享圖片,next
  • 輸入groupId和artifactId,next
  • 仍然選擇maven home directory為D:/Program Files (x86)/apache-maven-3.5.4-bin/apache-maven-3.5.4
  • user setting file選擇override,為D:\Program Files (x86)\apache-maven-3.5.4-bin\apache-maven-3.5.4\conf\settings.xml
  • local repository會自動檢測到修改過的本地倉庫路徑
  • 上述加下劃線的三步如果在default settings中配置過即可忽略
  • 點綠色的+,Name中輸入archetypeCatalog,Value中輸入internal,OK(該屬性設置可以加快項目創建速度),next,finish
  • 如果創建maven項目失敗,錯誤[ERROR] Maven execution terminated abnormally (exit code 1)
    • 原因:如果path裏有兩個java環境,則會導致創建失敗
    • 解決辦法:查看Path路徑下發現有C:\ProgramData\Oracle\Java\javapath和%JAVA_HOME%\bin這兩個java環境,刪除C:\ProgramData\Oracle\Java\javapath即可正常創建
  • 創建好的項目結構缺少一些文件夾,手動補全,Alt+Insert,按照上一篇的目錄結構添加directory,在main下添加java和resources,在src下添加test和resources
  • Ctrl+;調出Project Structure,點擊Modules,main下的java選擇Sources,main下resources選擇Resources;test下的java選擇Tests,test下的resources選擇Test Resources

技術分享圖片

5.maven的生命周期和插件

(1)完整項目的構建過程

  • 清理、編譯、測試、打包、集成測試、驗證、部署

(2)maven生命周期

  • clean  清理項目
    • pre-clean 執行清理前的工作
    • clean 清理上一次構建生成的所有文件
    • post-clean 執行清理後的文件
  • default  構建項目(最核心)
    • compile
    • test
    • package
    • install
  • site   生成項目站點
    • pre-site   在生成項目站點前要完成的工作
    • site 生成項目的站點文檔
    • post-site 在生成項目站點後要完成的工作
    • site-deploy 發布生成的站點到服務器上

(3)maven的插件

  • 詳細插件信息可查看http://maven.apache.org/plugins/index
  • 下面以使用source插件為例,希望運行package時即可將源碼打包,在pom.xml中寫入
<build>
    <plugins>
      <plugin>
        <artifactId>maven-source-plugin</artifactId>
        <version>2.4.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>jar-no-fork</goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  • 其中goals可以從上述網站中查看

6.maven中pom.xml解析

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


<!--project是pom.xml的根元素,包含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">
  <!--指定當前pom的版本,也是必不可少的元素-->
  <modelVersion>4.0.0</modelVersion>


  <groupId>反寫的公司網址+項目名</groupId>
  <artifactId>項目名+模塊名</artifactId>
  <!--第一個0表示大版本號
      第二個0表示分支版本號
      第三個0表示小版本號
      0.0.1
      snapshot   快照
      alpha      內部測試
      beta       公測
      Release    穩定
      GA         正式發布
  -->
  <version>1.0-SNAPSHOT</version>
  <!--jar war zip pom-->
  <packaging>war</packaging>


  <name>項目描述名</name>
  <url>項目地址</url>
  <description>項目描述</description>
  <developers>開發人員列表</developers>
  <licenses>開源框架許可證信息</licenses>
  <organization>組織信息</organization>


  <!--依賴列表-->
  <dependencies>
    <!--依賴項-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <type></type>
      <!--依賴範圍 test表示junit只在測試的依賴範圍內有用,在main主代碼中引用junit會報錯-->
      <scope>test</scope>
      <!--設置依賴是否可選,有true和false,默認是false,子項目繼承,若為true,子項目必須顯示引入該依賴-->
      <optional>false</optional>
      <!--排除依賴傳遞列表-->
      <exclusions>
        <exclusion>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>


  <!--依賴的管理,主要定義在父模塊中,供子模塊繼承-->
  <dependencyManagement>
    <!--依賴列表-->
    <dependencies>
      <!--多個依賴,但這些依賴並不會被運行,不會被引入實際的依賴中-->
      <dependency>
      </dependency>
    </dependencies>
  </dependencyManagement>


  <!--對構件行為提供相應的支持-->
  <build>
    <!--插件列表-->
    <plugins>
      <plugin>
        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>
      </plugin>
    </plugins>
    <!--通常用於子模塊對父模塊pom的繼承-->
    <parent></parent>
    <!--用來聚合運行多個maven項目,使很多maven模塊一起編譯-->
    <modules>
      <module></module>
    </modules>
  </build>
</project>

7.maven依賴範圍

(1)<scope>

  • maven的依賴範圍
  • 開發時使用某一框架,將該項目的jar包引入到項目的classpath路徑中,項目即可使用該框架為我們封裝好的一些方法
  • 依賴範圍就是控制依賴與classpath的關系

(2)maven中的classpath

  • 編譯
  • 測試:例如junit依賴範圍中的值test表明junit只存在於測試的classpath中
  • 運行

(3)scope的值

  • 打開http://maven.apache.org/,點擊右側欄中的Documentation-Index(category),點開Introductions-The Dependency Mechanism(依賴機制),找到Dependency Scope
  • 有6種scope的值,介紹如下
    • compile:默認的範圍,在編譯、測試、運行時都有效。
    • provided:在編譯、測試時有效。例子:Servlet API加載,運行時不會被加入,因為web容器已經包含了這些API,如果加入進去會導致沖突。
    • runtime:在測試、運行時有效。例子:jdbc驅動的實現,項目主代碼的編譯只需要JDK提供的jdbc的API,只有在執行測試和運行項目的時候才需要實現接口的具體的jdbc驅動。
    • test:只在測試時有效。例子:junit。
    • system:與provided相同,在編譯,測試時有效,與本機系統相關聯,可移植性差,換機子以後可能會出問題。比如我們要引用本機的JAVA_HOME,如果把項目移植到其他系統上,可能由於路徑的不一致而導致錯誤。
    • import:導入的依賴範圍,它只使用在dependencyManagement中,表示從其他的pom中導入dependency配置(是從其他pom中繼承的依賴)。

8.maven依賴傳遞

(1)依賴傳遞的例子

  • 假設A依賴於B,B依賴於C
  • 首先在B的pom.xml中添加B對C的依賴
<dependency>
    <groupId>com.gc.C</groupId>
    <artifactId>C</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
  • 再在A的pom.xml中添加A對B的依賴
<dependency>
    <groupId>com.gc.B</groupId>
    <artifactId>B</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
  • 然後對C clean package(生成C的jar包) install(C的jar包安裝到本地倉庫中);再對B clean package(生成B的jar包) install(B的jar包安裝到本地倉庫中)
  • 對A clean compile,即會發現在A的Maven Dependencies中有B.jar和C.jar。在A的pom.xml中並沒有配置C,所以這就是傳遞依賴

(2)排除依賴

  • 若A只想依賴於B,不想依賴於C,則可在A的pom.xml中加入exclusion,這樣A中Maven Dependencies就自動去除了C.jar
<dependency>
      <groupId>com.gc.B</groupId>
      <artifactId>B</artifactId>
      <version>1.0-SNAPSHOT</version>
      <exclusions>
            <exclusion>
                <groupId>com.gc.C</groupId>
                <artifactId>C</artifactId>
             </exclusion>
       </exclusions>
</dependency>

9.maven依賴沖突

(1)產生依賴沖突的場景

  • A和B依賴了不同版本的相同的構件,那麽對依賴A、B的C來說依賴的是哪個版本的構件,這就產生了依賴沖突

(2)兩條原則

  • 短路優先
    • A—>B—>C—>X(jar)
    • A—>D—>X(jar),選擇此依賴
  • 先聲明先優先
    • 如果路徑長度相同,則誰先聲明,先解析誰

10.maven聚合和繼承

(1)使用聚合的場景:

  • maven中將多個項目install,將其安裝到本地倉庫中,聚合可以將他們放到一起運行,稱為聚合

(2)聚合的例子:

  • 想要將項目A,B,C一起install到本地倉庫中
  • 新建一個新的maven項目D,其pom.xml如下
    <packaging>pom</packaging>
    
      <modules>
       <module>../A</module>
       <module>../B</module>
       <module>../C</module>
      </modules>
  • 對D的pom.xml clean install,即可將A,B,C生產jar包並安裝到本地倉庫中
  • D的pom.xml作為其他項目pom的容器

(3)使用繼承的場景:

  • 很多項目的pom.xml中有很多重復的配置,例如junit等,可以利用繼承減少配置

(4)繼承的例子:

  • 假設有parent項目和sub項目,則分別配置parent和sub的pom.xml
  • 新建一個新的maven項目parent,其pom.xml如下
<packaging>pom</packaging>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>4.11</junit.version>
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
  • 在sub項目中的pom.xml修改如下(將junit中的version和scope刪除):
    <parent>
      <groupId>com.gc.parent</groupId>
      <artifactId>parent</artifactId>
      <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
      </dependency>
    </dependencies>
  • 此時junit就可以從parent的pom中繼承過來

Maven核心知識