1. 程式人生 > 其它 >Maven基礎知識

Maven基礎知識

Maven自動化構建工具

第一章 Maven簡介

1.1 軟體開發中的階段

  1. 需求分析:分析專案具體完成的功能,有什麼要求,具體怎麼實現。

  2. 設計階段:根據分析的結果,設計專案使用的技術,解決難點。

  3. 開發階段:編碼實現功能,編譯程式碼。自我測試

  4. 測試階段:專業的測試人員,測整個專案的功能是否符合設計要求。出一個測試報告。

  5. 專案的打包,釋出階段:給使用者安裝專案

1.2 Maven能做什麼

  1. 專案的自動構建,幫助開發人員做專案程式碼的編譯,測試,打包,安裝,部署等工作。

  2. 管理依賴(管理專案中使用的各種jar)。

    • 依賴:專案中需要使用的其他資源,常見的是jar。比如專案要使用mysql驅動。我們就說專案依賴mysql驅動。

1.3 沒有使用Maven怎麼管理依賴

  • 管理jar包,需要從網路中單獨下載某個jar包

  • 需要選擇正確版本

  • 手工處理jar包檔案之間的依賴。例a.jar裡面要使用b.jar的類

1.4 什麼是Maven

  • Maven是apache基金會的開源專案,使用java語言開發。Maven這個單詞的本意是:專家,內行。

  • Maven是專案的自動化構建工具,管理專案的依賴

1.5 Maven中的概念

  1. POM

  2. 約定的目錄結構

  3. 座標

  4. 依賴管理

  5. 倉庫管理

  6. 生命週期

  7. 外掛和目標

  8. 繼承

  9. 聚合

1.6.1 Maven工具的獲取和安裝

  • 安裝:

    1. 確定JAVA_HOME指定jdk的安裝目錄,如果沒有JAVA_HOME,需要在windows的環境變數中建立JAVA_HOME,它的值是jdk的安裝目錄

    2. 解壓縮 apache-maven-3.6.0-bin.zip,把解壓後的檔案放到一個目錄中。

      • 注:目錄的路徑不要有中文,不要有空格

    3. 把Maven安裝目錄中下的bin路徑新增到path中

    4. 測試Maven的安裝,在命令列執行mvn -v

    C:\Users\naizhi>mvn -v
    Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-25T02:41:47+08:00)
    Maven home: D:\apache-maven-3.6.0\bin\..
    Java version: 1.8.0_131, vendor: Oracle Corporation, runtime: D:\Java\jdk1.8.0_131\jre
    Default locale: zh_CN, platform encoding: GBK
    OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
    • Maven解壓後的目錄結構

1.6.2 Maven的其他安裝方式

  1. 確定JAVA_HOME是否有效

  2. 在環境變數中,建立一個叫做M2_HOME(或者MAVEN_HOME),它的值是Maven的安裝目錄

    • M2_HOME=D:\apache-maven-3.6.0

  3. 在Path環境變數中,加入%M2_MOHE%\bin

  4. 測試maven的安裝,在命令列執行mvn -v

C:\Users\naizhi>mvn -v
Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-25T02:41:47+08:00)
Maven home: D:\apache-maven-3.6.0\bin\..
Java version: 1.8.0_131, vendor: Oracle Corporation, runtime: D:\Java\jdk1.8.0_131\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

第二章 Maven的核心概念

2.1 約定的目錄結構

  • Maven專案使用的大多人遵循的目錄結構。叫做約定的目錄結構

  • 一個Maven專案是一個資料夾。比如專案叫做Hello

Hello 專案資料夾
\src
\main 主程式目錄(完成專案功能的程式碼和配置檔案)
\java 原始碼(包和相關的類定義)
\resources 配置檔案
\test 放置測試程式程式碼的(開發人員自己寫的測試程式碼)
\java 測試程式碼的(junit)
\resources 測試程式需要的配置檔案
\pom.xml maven的配置檔案,核心
  • Maven的使用方式:

    1. Maven可以獨立使用:建立專案、編譯程式碼、測試程式、打包、部署等等

    2. Maven和IDEA一起使用:通過IDEA藉助Maven,實現編碼、測試、打包等等

2.2 POM

  • POM:Project Object Model 專案物件模型,Maven把專案當做模型處理,操作這個模型就是操作專案。Maven通過pom.xml檔案實現專案的構建和依賴的管理。

<?xml version="1.0" encoding="UTF-8"?>
<!--project是根標籤,後面的是約束檔案-->
<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是模型的版本,就是4.0.0-->
<modelVersion>4.0.0</modelVersion>
<!--座標-->
<groupId>com.kgc</groupId>
<artifactId>ch01-first</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<!--配置檔案-->
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

</project>

2.3 座標(gav)

  • 座標組成是groupid,artifactid,version。座標概念來自數學。

  • 座標的作用:確定資源的,是資源的唯一標識。在Maven中,每個資源都有座標,座標值是唯一的。簡稱是gav

  <groupId>com.kgc</groupId>
<artifactId>ch01-first</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
groupId:組織名稱,程式碼。公司,團體或者單位的標識。這個值常使用的公司域名的倒寫。
例如:百度的網站 www.baidu.com,groupId:com.baidu
如果專案規模比較大,也可以是域名倒寫+大專案名稱
例如:百度的無人車專案:com.baidu.appollo
artifactId:專案名稱,如果groupId中有專案,此時當前的值就是子專案名。專案名稱是唯一的。
version:版本,專案的版本號,使用的數字。三位組成。例如:主版本號.次版本號.小版本號。例如:5.2.5
注意:版本號中有-SNAPSHOT,表示快照,不是穩定的版本。
packaging:專案打包的型別,有jar、war、rar。ear、pom等等,預設是jar
  • 專案使用gav:

    1. 每個Maven專案,都需要有一個自己的gav

    2. 我們管理依賴時,需要使用其他的jar包,也需要使用gav作為標識

  • 搜尋座標的地址:https://mvnrepository.com/

2.4 依賴(dependency)

  • 依賴:專案中要使用的其他資源(jar)。

  • 需要使用Maven表示依賴,管理依賴。通過使用dependency和gav一起完成依賴的使用

  • 需要在pom.xml檔案中,使用dependencies和dependency,還有gav完成依賴的說明。

  • 格式:

<dependencies>
<!--mysql驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!--日誌-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

</dependencies>
maven使用gav作為標識,從網際網路下載依賴的jar。下載到你的本機上。由maven管理專案使用的這些jar

2.5 倉庫

  • 倉庫是存東西的,Maven的倉庫存放的有:

    1. Maven工具自己的jar包

    2. 第三方的其他jar,比如專案中要使用mysql驅動

    3. 自己寫的程式,可以打包為jar,存放到倉庫

  • 倉庫的分類:

    1. 本地倉庫(本機倉庫):位於你自己的計算機,它是磁碟中的某個目錄

      • 本地倉庫預設路徑:是你登入作業系統的賬號目錄中,例如:C:\Users\naizhi.m2\repository

      • 修改本地倉庫的位置:修改Maven工具的配置檔案(maven的安裝路徑\conf\setting.xml)

      • 步驟:

        1. 建立一個目錄,作為倉庫使用。目錄不要有中文和空格,目錄不要太深

        2. 修改setting.xml檔案,指定D:/openrepository這個目錄

        <localRepository>D:/openrepository</localRepository>
        1. 把需要用到的資源拷貝到D:/openrepository

    2. 遠端倉庫:需要通過網際網路訪問的

      1. 中央倉庫:一個ftp伺服器,存放了所有的資源

      2. 中央倉庫的映象:就是中央倉庫的拷貝,在各大主要城市都有映象

      3. 私服:在區域網中使用的,私服就是自己的倉庫伺服器,在公司內部使用的

  • Maven使用倉庫:Maven自動使用倉庫,當專案啟動後,執行了Maven的命令,Maven首先訪問的是本地倉庫,從倉庫中獲取所需的jar,如果本地倉庫沒有,需要訪問私服或者中央倉庫或者映象

2.6 Maven的生命週期、外掛和命令

  • Maven的生命週期:專案構建的各個階段。包括:清理、編譯、測試、報告、打包、安裝、部署

  • 外掛:要完成構建專案的各個階段,要使用Maven的命令,執行命令的功能是通過外掛完成的。外掛就是jar、一些類

  • 命令:執行Maven功能是由命令發出的。比如mvn compile

  • 單元測試(junit):

    • junit是一個單元測試工具,在java中經常使用

    • 單元:在java中指的是方法。一個方法就是一個單元,方法是測試的最小單元

    • 作用:使用junit去測試方法是否完成流量要求。開發人員自測

  • 使用單元測試:

    1. 加入junit的依賴(一些類和方法)

    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
    </dependency>
    1. 在src/test/java目錄中建立測試類檔案,寫測試程式碼

      • 單元測試使用的建議:

        1. 測試類的定義,名稱一般是Test+要測試的類名稱

        2. 測試類它的包名和要測試的類包名一樣

        3. 在類中定義方法,要測試程式碼

        方法的定義:public方法,
        沒有返回值
        方法名稱自定義(建議Test+測試的方法名稱)
        方法沒有引數
        1. 在測試類中的方法,可以單獨執行。測試類也可以單獨執行

        2. 在方法的上面加入@Test

  • 命令:

    1. mvn clean:清理命令,作用刪除以前生成的資料,刪除target目錄

      • 外掛:maven-clean-plugin,版本是2.5

    2. mvn compile:編譯命令,執行的程式碼編譯,把src/main/java目錄中的java程式碼編譯為class檔案。同時把class檔案拷貝到target/classes目錄。這個目錄classes是存放類檔案的根目錄(也叫做類路徑,classpath)

      • 外掛:maven-compile-plugin,版本是3.1。編譯程式碼的外掛

      • 外掛:maven-resources-plugin,版本是2.6。資源外掛,處理檔案的。作用是把src/main/resources目錄中的檔案拷貝target/classes目錄中

    3. mvn test-compile:編譯命令,編譯src/test/java目錄中的原始檔,把生成的class拷貝到target/test-classes目錄。同時把src/test/resources目錄中的檔案拷貝到test-classes目錄中

      • 外掛:maven-compile-plugin,版本是3.1。編譯程式碼的外掛

      • 外掛:maven-resources-plugin,版本是2.6。資源外掛,處理檔案的

    4. mvn test:測試目錄,作用執行test-classes目錄的程式,測試src/main/java目錄中的主程式程式碼是否符合要求

      • 外掛:maven-surefire-plugin 版本2.12.4

    5. mvn package:打包,作用是把專案中的資源class檔案和配置檔案都放在一個壓縮檔案中,預設壓縮檔案是jar型別的。web應用是war型別,副檔名是jar、war

      • 外掛:maven-jar-plugin 版本2.4.執行打包處理,生成一個jar擴充套件的檔案,放在target目錄下

      • 打包的檔案包含的是src/main目錄中的所有生成的class和配置檔案和test無關

      • 生成的是ch01-first-1.0.jar

      <groupId>com.kgc</groupId>
      <artifactId>ch01-first</artifactId>
      <version>1.0</version>
      <packaging>jar</packaging>
      打包的檔名:artifactId-version.packaging
    6. mvn install:安裝,把生成的打包檔案,安裝到maven倉庫

      • 外掛:maven-install-plugin 版本2.4.把生成的jar檔案安裝到本地倉庫

      • 檢視倉庫中的jar檔案:

      <groupId>com.kgc</groupId>
      <artifactId>ch01-first</artifactId>
      <version>1.0</version>
      <packaging>jar</packaging>
      groupId中的值,如果有"."前和後都是獨立的資料夾 com\kgc
      artifactId,獨立的資料夾
      version,獨立的資料夾

2.7 自定義配置外掛

  • 在pom.xml檔案中,build標籤中,設定外掛

<!--設定構建專案相關的內容-->
<build>
<plugins>
<!--設定外掛-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-archetype-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source> <!--指定編譯程式碼的jdk版本-->
<target>1.8</target> <!--執行java程式使用的jdk版本-->
</configuration>
</plugin>
</plugins>
</build>

第三章 Maven和IDEA的整合

3.1 IDEA中整合Maven

  • idea中有一個自帶的maven。我們要讓idea使用自己安裝的maven

  1. 選擇File-Settings

  • 設定項:-DarchetypeCatalog=internal

  1. File-Other Settings

  • 同上設定即可

3.2 建立普通Java專案

  • pom.xml

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

<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>com.kgc</groupId>
<artifactId>ch01-maven-j2se</artifactId>
<version>1.0</version>
<!--maven的常用設定-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<!--依賴列表-->
<dependencies>
<!--單元測試-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

3.3 建立web專案

  • pom.xml

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

<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>com.kgc</groupId>
<artifactId>ch02-maven-web</artifactId>
<version>1.0</version>
<packaging>war</packaging>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>

<dependencies>
<!--servlet依賴-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp依賴-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<!--單元測試-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

3.4 匯入Maven工程(module)到idea

第四章 依賴管理

  • 依賴範圍:使用scope表示依賴的範圍

  • 依賴範圍表示:這個依賴(jar和裡面類)在專案構建的哪個階段起作用

  • 依賴範圍scope:

    1. complie:預設,參與構建專案的所有階段

    2. test:測試,在測試階段使用,比如執行mvn test會使用junit

    3. provided:提供者,專案在部署到伺服器時,不需要提供這個依賴的jar,而是由伺服器提供這個依賴的jar

      • 明顯的是servlet和jsp依賴

第五章 常用設定

  1. 主要是properties裡面的配置

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>專案構建使用的編碼,避免中文亂碼
<maven.compiler.source>1.8</maven.compiler.source>原始碼編譯jdk版本
<maven.compiler.target>1.8</maven.compiler.target>執行程式碼的jdk版本
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>生成報告的編碼
</properties>
  1. 全域性變數

    • 在properties定義標籤,這個標籤就是一個變數,標籤的文字就是變數的值。

    • 使用這個全域性變量表示多個依賴使用的版本號

    • 使用步驟:

      1. 在properties標籤中,定義一個標籤,指定版本的值

      <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
      <!--自定義變數-->
      <spring.version>5.2.5.RELEASE</spring.version>
      <junit.version>4.11</junit.version>
      </properties>
      1. 使用全域性變數,語法:${變數名}

      <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
      </dependency>

      <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
      </dependency>

      <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
      </dependency>
  1. 使用資源外掛

    • 處理和配置檔案的資訊,Maven預設處理配置檔案

    1. maven會把src/main/resources目錄中的檔案,拷貝到target/classes目錄下

    2. maven只處理src/main/java目錄中的.java檔案,把這些java檔案編譯為class,拷貝到target/classes目錄下,不處理其他檔案

<build>
<!--資源外掛
作用:告訴maven把src/main/java目錄中的指定副檔名的檔案拷貝到target/classes目錄中
-->
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目錄-->
<includes>
<!--包括目錄下的.proerties和.xml檔案都會掃描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!--filtering選擇false不啟動過濾器,*.properties已經起到過濾的作用了-->
<filtering>false</filtering>
</resource>
</resources>
</build>