一、MAVEN能做什么?
- 清理項(xiàng)目 mvn clean
- 編譯項(xiàng)目 mvn compiler
- 測(cè)試項(xiàng)目 mvn test
- 生成測(cè)試報(bào)告
- 打包項(xiàng)目 mvn package
- 部署項(xiàng)目
二、安裝maven
- 下載maven,解壓至/Users/QQ960911789
- 配置環(huán)境變量
export M2_HOME=/Users/QQ960911789/apache-maven-3.5.0
export PATH=$PATH:$M2_HOME/bin

三、MAVEN項(xiàng)目結(jié)構(gòu)
src
--main
----java ——存放項(xiàng)目的.java文件
----resources ——存放項(xiàng)目資源文件,如spring
--test
----java ——存放所有測(cè)試.java文件,如JUnit測(cè)試類
----resources ——存放項(xiàng)目資源文件,如spring
target ——項(xiàng)目輸出位置
pom.xml ——用于標(biāo)識(shí)該項(xiàng)目是一個(gè)Maven項(xiàng)目


四、Pom.xml配置
<?xml version="1.0"?>
<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.foxconn.zqq</groupId>
<artifactId>testMaven</artifactId>
<version>SNAPSHOT-1.0.0</version>
</project>
POM是項(xiàng)目對(duì)象模型(Project Object Model)的簡(jiǎn)稱,它是Maven項(xiàng)目中的文件,使用XML表示,名稱叫做pom.xml。在Maven世界中,project可以什么都沒(méi)有,甚至沒(méi)有代碼,但是必須包含pom.xml文件。
五、創(chuàng)建項(xiàng)目如下
testMaven
pom.xml
mkdir命令 創(chuàng)建文件夾
touch命令 創(chuàng)建文件

運(yùn)行 mvn clean
運(yùn)行 mvn package

groupId:定義maven的項(xiàng)目,可以用包名
artifactId:定義項(xiàng)目中的一個(gè)模塊,一般都是工程名
version:版本
packaging:定義打包方式
坐標(biāo)的作用:
用來(lái)唯一標(biāo)識(shí)一個(gè)構(gòu)件,在依賴?yán)锩娓鶕?jù)坐標(biāo)來(lái)找需要的構(gòu)件。
六、引入junit并測(cè)試
切換到IDEA工具下開發(fā)該項(xiàng)目
pom.xml,編寫后IDEA有提示是否默認(rèn)導(dǎo)入maven包,選擇即可
<?xml version="1.0"?>
<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.foxconn.zqq</groupId>
<artifactId>testMaven</artifactId>
<version>SNAPSHOT-1.0.0</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
</project>
創(chuàng)建類時(shí),應(yīng)注意創(chuàng)建在src/test文件夾下以Test為結(jié)尾的類,與surefire測(cè)試插件有關(guān),如果創(chuàng)建不滿足規(guī)則的測(cè)試類,則不會(huì)運(yùn)行帶有@Test的方法;如果編寫類時(shí),引入@Test注解報(bào)錯(cuò):Annotation not allowed here,刪除該類再創(chuàng)建即可
package com.foxconn.zqq;
import org.junit.Test;
public class HelloTest {
@Test
public void test(){
System.out.println("hello test");
}
}
import org.junit.Test;
public class MyTest {
@Test
public void test(){
System.out.println("MyTest m test method running");
}
@Test
public void test2(){
System.out.println("test2 a a a ");
}
}
View-Tool Windows-Terminal或者Alt+F12 ,mvn test,測(cè)試src/test下的測(cè)試類

七、Maven單元測(cè)試
1.maven-surefire-plugin簡(jiǎn)介
Maven本身并不是一個(gè)單元測(cè)試框架,它只是在構(gòu)建執(zhí)行到特定生命周期階段的時(shí)候,通過(guò)插件來(lái)執(zhí)行JUnit或者TestNG的測(cè)試用例。這個(gè)插件就是maven-surefire-plugin,也可以稱為測(cè)試運(yùn)行器(Test Runner),它能兼容JUnit 3、JUnit 4以及TestNG。
在默認(rèn)情況下,maven-surefire-plugin的test目標(biāo)會(huì)自動(dòng)執(zhí)行測(cè)試源碼路徑(默認(rèn)為src/test/java/)下所有符合一組命名模式的測(cè)試類。這組模式為:
*/Test.java:任何子目錄下所有命名以Test開關(guān)的Java類。
*/Test.java:任何子目錄下所有命名以Test結(jié)尾的Java類。
*/TestCase.java:任何子目錄下所有命名以TestCase結(jié)尾的Java類。
2.跳過(guò)測(cè)試
打包時(shí)經(jīng)常不需要測(cè)試,需要跳過(guò)test,因?yàn)閠est中都是對(duì)接口的單元測(cè)試,如果測(cè)試不通過(guò),則不能正常打包;
測(cè)試中的方法會(huì)執(zhí)行,速度慢
①mvn package -Dmaven.test.skip=true

測(cè)試報(bào)告:



②pom.xml中配置跳過(guò)測(cè)試
<?xml version="1.0"?>
<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.foxconn.zqq</groupId>
<artifactId>testMaven</artifactId>
<version>SNAPSHOT-1.0.0</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
<build>
<!--修改生成的jar/war的名稱-->
<finalName>testMaven-1.0</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>
可以看到,運(yùn)行mvn package時(shí),已跳過(guò)測(cè)試

3.動(dòng)態(tài)指定要運(yùn)行的測(cè)試用例
maven-surefire-plugin提供了一個(gè)test參數(shù)讓Maven用戶能夠在命令行指定要運(yùn)行的測(cè)試用例。如:
mvn test -Dtest=RandomGeneratorTest
也可以使用通配符:
mvn test -Dtest=RandomTest
或者也可以使用“,”號(hào)指定多個(gè)測(cè)試類:
mvn test -Dtest=RandomTest,AccountCaptchaServiceTest
4.包含與排除測(cè)試用例
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<includes>
<include>**/*Tests.java</include>
</includes>
<excludes>
<exclude>**/*ServiceTest.java</exclude>
<exclude>**/TempDaoTest.java</exclude>
</excludes>
</configuration>
</plugin>
5.生成測(cè)試報(bào)告
5.1基本測(cè)試報(bào)告
默認(rèn)情況下,maven-surefire-plugin會(huì)在項(xiàng)目的target/surefire-reports目錄下生成兩種格式的錯(cuò)誤報(bào)告。
簡(jiǎn)單文本格式——內(nèi)容十分簡(jiǎn)單,可以看出哪個(gè)測(cè)試項(xiàng)出錯(cuò)。
與JUnit兼容的XML格式——XML格式已經(jīng)成為了Java單元測(cè)試報(bào)告的事實(shí)標(biāo)準(zhǔn),這個(gè)文件可以用其他的工具如IDE來(lái)查看。
八、mvn package
打包時(shí),執(zhí)行mvn package(默認(rèn)也會(huì)執(zhí)行src/test文件夾下的test方法)

打包位置:默認(rèn)生成jar包(在pom.xml的packaging配置),位置如下

九、maven插件
maven的命令及相關(guān)骨架都是插件

十、maven概念模型

依賴管理模型
Maven倉(cāng)庫(kù)布局
1、本地倉(cāng)庫(kù)
默認(rèn)情況下,不管是在windows還是linux上,每個(gè)用戶在自己的用戶目錄下都有一個(gè)路徑名為.m2/repository/的倉(cāng)庫(kù)目錄。有時(shí)候,因?yàn)槟承┰?例如C盤空間不夠),用戶會(huì)想要自定義本地倉(cāng)庫(kù)目錄地址。這時(shí),可以拷貝apache-maven-3.5.0中的settings.xml文件拷貝至~/.m2/settings.xml,然后編輯,設(shè)置localRepository元素的值為想要的倉(cāng)庫(kù)地址。例如:
<settings>
<localRepository>D:\java\repository\</localRepository>
</settings>
2、遠(yuǎn)程倉(cāng)庫(kù)
安裝好Maven后,如果不執(zhí)行任何Maven命令,本地倉(cāng)庫(kù)目錄是不存在的。當(dāng)用戶輸入第一條Maven命令之后,Maven才會(huì)創(chuàng)建本地倉(cāng)庫(kù),然后根據(jù)配置和需要,從遠(yuǎn)程倉(cāng)庫(kù)下載構(gòu)件至本地倉(cāng)庫(kù)。
3、中央倉(cāng)庫(kù)(位置在美國(guó))
可以使用解壓工具打開jar文件$M2_HOME/lib/maven-model-builder-3.0.jar,里面可以看到pom.xml中的中央倉(cāng)庫(kù)配置
4、私服
私服是一種特殊的遠(yuǎn)程倉(cāng)庫(kù),它是架設(shè)在局域網(wǎng)內(nèi)的倉(cāng)庫(kù)服務(wù),私服代理廣域網(wǎng)上的遠(yuǎn)程倉(cāng)庫(kù),供局域網(wǎng)內(nèi)的Maven用戶使用。當(dāng)Maven需要下載構(gòu)件的時(shí)候,它從私服請(qǐng)求,如果私服上不存在該構(gòu)件,則從外部的遠(yuǎn)程倉(cāng)庫(kù)下載,緩存在私服上之后,再為Maven的下載請(qǐng)求提供服務(wù)。此外,一些無(wú)法從外部倉(cāng)庫(kù)下載到的構(gòu)件也能從本地上傳到私服上供大家使用。
3.中央倉(cāng)庫(kù):
apache-maven-3.5.0/lib

最頂層pom文件:modelVersion、中央倉(cāng)庫(kù)位置、插件中央倉(cāng)庫(kù)位置、相應(yīng)的target等位置定義
本地倉(cāng)庫(kù):~/.m2/repository
本地插件倉(cāng)庫(kù):命令行使用的命令依賴于該插件庫(kù)

用jd-gui反編譯工具或者360解壓工具查看
如下,定義了modelVersion版本4.0.0,同理項(xiàng)目中也應(yīng)與此保持一致;
定義了中央倉(cāng)庫(kù),插件倉(cāng)庫(kù),maven目錄結(jié)構(gòu)

十一、dependency依賴中scope范圍
1、compile
默認(rèn)編譯依賴范圍。對(duì)于編譯,測(cè)試,運(yùn)行三種classpath都有效
2、test
測(cè)試依賴范圍。只對(duì)于測(cè)試classpath有效,只對(duì)測(cè)試代碼有效
3、provided
已提供依賴范圍。對(duì)于編譯,測(cè)試的classpath都有效,但對(duì)于運(yùn)行無(wú)效。因?yàn)橛扇萜饕呀?jīng)提供,例如servlet-api,打包的時(shí)候這個(gè)包不會(huì)打進(jìn)去
4、runtime
運(yùn)行時(shí)提供。例如:jdbc驅(qū)動(dòng)
Compile、runtime打包會(huì)打進(jìn)去,test、provided打包不會(huì)打進(jìn)去
5、傳遞性依賴原則
1.路徑最近者優(yōu)先 C?B?A,C依賴B,B依賴A,會(huì)先用B的jar包
例:C的pom.xml依賴B,B的pom.xml依賴A
B中junit-4.10,A中junit-4.11,就近原則,C中引用junit-4.11
2.路徑相同,第一聲明者優(yōu)先:C?B,C?A,必須看B,A在C中哪一個(gè)先聲明
例:C的pom.xml依賴B,C的pom.xml依賴A
B中junit-4.10,A中junit-4.11,就近原則,
C中先引用B,C中引用junit-4.10
C中先引用A,C中引用junit-4.11
同一個(gè)工程中的模塊可以相互依賴,idea中是project的概念,如果通過(guò)maven依賴,需要先在本project中查找,而后在本地倉(cāng)庫(kù),鏡像,中央倉(cāng)庫(kù)查找,
1.如果是本地2個(gè)不同的project,則需要通過(guò)mvn install,上傳至本地倉(cāng)庫(kù)
2.在1個(gè)project中建立不同的module,可以配置依賴
1.project:test1710/project:test171002
test171002

test1710:

2.project下不同的module
project:test02 module:test02A/module:test02B/module:test02C
test02A
<groupId>com.foxconn.zqq</groupId>
<artifactId>test02A</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
test02B
<groupId>com.foxconn.zqq</groupId>
<artifactId>test02B</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
test02C
<groupId>com.foxconn.zqq</groupId>
<artifactId>test02C</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.foxconn.zqq</groupId>
<artifactId>test02A</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.foxconn.zqq</groupId>
<artifactId>test02B</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
