Maven基礎知識
第一章 Maven簡介
1.1 軟體開發中的階段
-
需求分析:分析專案具體完成的功能,有什麼要求,具體怎麼實現。
-
設計階段:根據分析的結果,設計專案使用的技術,解決難點。
-
開發階段:編碼實現功能,編譯程式碼。自我測試
-
測試階段:專業的測試人員,測整個專案的功能是否符合設計要求。出一個測試報告。
-
專案的打包,釋出階段:給使用者安裝專案
1.2 Maven能做什麼
-
專案的自動構建,幫助開發人員做專案程式碼的編譯,測試,打包,安裝,部署等工作。
-
管理依賴(管理專案中使用的各種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中的概念
-
POM
-
約定的目錄結構
-
座標
-
依賴管理
-
倉庫管理
-
生命週期
-
外掛和目標
-
繼承
-
聚合
1.6.1 Maven工具的獲取和安裝
-
地址:https://maven.apache.org/
-
安裝:
-
確定JAVA_HOME指定jdk的安裝目錄,如果沒有JAVA_HOME,需要在windows的環境變數中建立JAVA_HOME,它的值是jdk的安裝目錄
-
解壓縮 apache-maven-3.6.0-bin.zip,把解壓後的檔案放到一個目錄中。
-
注:目錄的路徑不要有中文,不要有空格
-
-
把Maven安裝目錄中下的bin路徑新增到path中
-
測試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的其他安裝方式
-
確定JAVA_HOME是否有效
-
在環境變數中,建立一個叫做M2_HOME(或者MAVEN_HOME),它的值是Maven的安裝目錄
-
M2_HOME=D:\apache-maven-3.6.0
-
-
在Path環境變數中,加入%M2_MOHE%\bin
-
測試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的使用方式:
-
Maven可以獨立使用:建立專案、編譯程式碼、測試程式、打包、部署等等
-
Maven和IDEA一起使用:通過IDEA藉助Maven,實現編碼、測試、打包等等
-
2.2 POM
-
POM:Project Object Model 專案物件模型,Maven把專案當做模型處理,操作這個模型就是操作專案。Maven通過pom.xml檔案實現專案的構建和依賴的管理。
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:
-
每個Maven專案,都需要有一個自己的gav
-
我們管理依賴時,需要使用其他的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的倉庫存放的有:
-
Maven工具自己的jar包
-
第三方的其他jar,比如專案中要使用mysql驅動
-
自己寫的程式,可以打包為jar,存放到倉庫
-
-
倉庫的分類:
-
本地倉庫(本機倉庫):位於你自己的計算機,它是磁碟中的某個目錄
-
本地倉庫預設路徑:是你登入作業系統的賬號目錄中,例如:C:\Users\naizhi.m2\repository
-
修改本地倉庫的位置:修改Maven工具的配置檔案(maven的安裝路徑\conf\setting.xml)
-
步驟:
-
建立一個目錄,作為倉庫使用。目錄不要有中文和空格,目錄不要太深
-
修改setting.xml檔案,指定D:/openrepository這個目錄
<localRepository>D:/openrepository</localRepository>
-
把需要用到的資源拷貝到D:/openrepository
-
-
-
遠端倉庫:需要通過網際網路訪問的
-
中央倉庫:一個ftp伺服器,存放了所有的資源
-
中央倉庫的映象:就是中央倉庫的拷貝,在各大主要城市都有映象
-
私服:在區域網中使用的,私服就是自己的倉庫伺服器,在公司內部使用的
-
-
-
Maven使用倉庫:Maven自動使用倉庫,當專案啟動後,執行了Maven的命令,Maven首先訪問的是本地倉庫,從倉庫中獲取所需的jar,如果本地倉庫沒有,需要訪問私服或者中央倉庫或者映象
2.6 Maven的生命週期、外掛和命令
-
Maven的生命週期:專案構建的各個階段。包括:清理、編譯、測試、報告、打包、安裝、部署
-
外掛:要完成構建專案的各個階段,要使用Maven的命令,執行命令的功能是通過外掛完成的。外掛就是jar、一些類
-
命令:執行Maven功能是由命令發出的。比如mvn compile
-
單元測試(junit):
-
junit是一個單元測試工具,在java中經常使用
-
單元:在java中指的是方法。一個方法就是一個單元,方法是測試的最小單元
-
作用:使用junit去測試方法是否完成流量要求。開發人員自測
-
-
使用單元測試:
-
加入junit的依賴(一些類和方法)
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
-
在src/test/java目錄中建立測試類檔案,寫測試程式碼
-
單元測試使用的建議:
-
測試類的定義,名稱一般是Test+要測試的類名稱
-
測試類它的包名和要測試的類包名一樣
-
在類中定義方法,要測試程式碼
方法的定義:public方法,
沒有返回值
方法名稱自定義(建議Test+測試的方法名稱)
方法沒有引數-
在測試類中的方法,可以單獨執行。測試類也可以單獨執行
-
在方法的上面加入@Test
-
-
-
-
命令:
-
mvn clean:清理命令,作用刪除以前生成的資料,刪除target目錄
-
外掛:maven-clean-plugin,版本是2.5
-
-
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目錄中
-
-
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。資源外掛,處理檔案的
-
-
mvn test:測試目錄,作用執行test-classes目錄的程式,測試src/main/java目錄中的主程式程式碼是否符合要求
-
外掛:maven-surefire-plugin 版本2.12.4
-
-
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 -
-
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
-
選擇File-Settings
-
設定項:-DarchetypeCatalog=internal
-
File-Other Settings
-
同上設定即可
3.2 建立普通Java專案
-
pom.xml
3.3 建立web專案
-
pom.xml
3.4 匯入Maven工程(module)到idea
第四章 依賴管理
-
依賴範圍:使用scope表示依賴的範圍
-
依賴範圍表示:這個依賴(jar和裡面類)在專案構建的哪個階段起作用
-
依賴範圍scope:
-
complie:預設,參與構建專案的所有階段
-
test:測試,在測試階段使用,比如執行mvn test會使用junit
-
provided:提供者,專案在部署到伺服器時,不需要提供這個依賴的jar,而是由伺服器提供這個依賴的jar
-
明顯的是servlet和jsp依賴
-
-
第五章 常用設定
-
主要是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>
-
全域性變數
-
在properties定義標籤,這個標籤就是一個變數,標籤的文字就是變數的值。
-
使用這個全域性變量表示多個依賴使用的版本號
-
使用步驟:
-
在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>-
使用全域性變數,語法:${變數名}
<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> -
-
-
使用資源外掛
-
處理和配置檔案的資訊,Maven預設處理配置檔案
-
maven會把src/main/resources目錄中的檔案,拷貝到target/classes目錄下
-
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>