一、MAVEN能做什么?
- 清理项目 mvn clean
- 编译项目 mvn compiler
- 测试项目 mvn test
- 生成测试报告
- 打包项目 mvn package
- 部署项目
二、安装maven
- 下载maven,解压至/Users/QQ960911789
- 配置环境变量
export M2_HOME=/Users/QQ960911789/apache-maven-3.5.0
export PATH=$PATH:$M2_HOME/bin
三、MAVEN项目结构
src
--main
----java ——存放项目的.java文件
----resources ——存放项目资源文件,如spring
--test
----java ——存放所有测试.java文件,如JUnit测试类
----resources ——存放项目资源文件,如spring
target ——项目输出位置
pom.xml ——用于标识该项目是一个Maven项目
四、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是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml。在Maven世界中,project可以什么都没有,甚至没有代码,但是必须包含pom.xml文件。
五、创建项目如下
testMaven
pom.xml
mkdir命令 创建文件夹
touch命令 创建文件
运行 mvn clean
运行 mvn package
groupId:定义maven的项目,可以用包名
artifactId:定义项目中的一个模块,一般都是工程名
version:版本
packaging:定义打包方式
坐标的作用:
用来唯一标识一个构件,在依赖里面根据坐标来找需要的构件。
六、引入junit并测试
切换到IDEA工具下开发该项目
pom.xml,编写后IDEA有提示是否默认导入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>
创建类时,应注意创建在src/test文件夹下以Test为结尾的类,与surefire测试插件有关,如果创建不满足规则的测试类,则不会运行带有@Test的方法;如果编写类时,引入@Test注解报错:Annotation not allowed here,删除该类再创建即可
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,测试src/test下的测试类
七、Maven单元测试
1.maven-surefire-plugin简介
Maven本身并不是一个单元测试框架,它只是在构建执行到特定生命周期阶段的时候,通过插件来执行JUnit或者TestNG的测试用例。这个插件就是maven-surefire-plugin,也可以称为测试运行器(Test Runner),它能兼容JUnit 3、JUnit 4以及TestNG。
在默认情况下,maven-surefire-plugin的test目标会自动执行测试源码路径(默认为src/test/java/)下所有符合一组命名模式的测试类。这组模式为:
*/Test.java:任何子目录下所有命名以Test开关的Java类。
*/Test.java:任何子目录下所有命名以Test结尾的Java类。
*/TestCase.java:任何子目录下所有命名以TestCase结尾的Java类。
2.跳过测试
打包时经常不需要测试,需要跳过test,因为test中都是对接口的单元测试,如果测试不通过,则不能正常打包;
测试中的方法会执行,速度慢
①mvn package -Dmaven.test.skip=true
测试报告:
②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>
<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>
可以看到,运行mvn package时,已跳过测试
3.动态指定要运行的测试用例
maven-surefire-plugin提供了一个test参数让Maven用户能够在命令行指定要运行的测试用例。如:
mvn test -Dtest=RandomGeneratorTest
也可以使用通配符:
mvn test -Dtest=RandomTest
或者也可以使用“,”号指定多个测试类:
mvn test -Dtest=RandomTest,AccountCaptchaServiceTest
4.包含与排除测试用例
<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.生成测试报告
5.1基本测试报告
默认情况下,maven-surefire-plugin会在项目的target/surefire-reports目录下生成两种格式的错误报告。
简单文本格式——内容十分简单,可以看出哪个测试项出错。
与JUnit兼容的XML格式——XML格式已经成为了Java单元测试报告的事实标准,这个文件可以用其他的工具如IDE来查看。
八、mvn package
打包时,执行mvn package(默认也会执行src/test文件夹下的test方法)
打包位置:默认生成jar包(在pom.xml的packaging配置),位置如下
九、maven插件
maven的命令及相关骨架都是插件
十、maven概念模型
依赖管理模型
Maven仓库布局
1、本地仓库
默认情况下,不管是在windows还是linux上,每个用户在自己的用户目录下都有一个路径名为.m2/repository/的仓库目录。有时候,因为某些原因(例如C盘空间不够),用户会想要自定义本地仓库目录地址。这时,可以拷贝apache-maven-3.5.0中的settings.xml文件拷贝至~/.m2/settings.xml,然后编辑,设置localRepository元素的值为想要的仓库地址。例如:
<settings>
<localRepository>D:\java\repository\</localRepository>
</settings>
2、远程仓库
安装好Maven后,如果不执行任何Maven命令,本地仓库目录是不存在的。当用户输入第一条Maven命令之后,Maven才会创建本地仓库,然后根据配置和需要,从远程仓库下载构件至本地仓库。
3、中央仓库(位置在美国)
可以使用解压工具打开jar文件$M2_HOME/lib/maven-model-builder-3.0.jar,里面可以看到pom.xml中的中央仓库配置
4、私服
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。此外,一些无法从外部仓库下载到的构件也能从本地上传到私服上供大家使用。
3.中央仓库:
apache-maven-3.5.0/lib
最顶层pom文件:modelVersion、中央仓库位置、插件中央仓库位置、相应的target等位置定义
本地仓库:~/.m2/repository
本地插件仓库:命令行使用的命令依赖于该插件库
用jd-gui反编译工具或者360解压工具查看
如下,定义了modelVersion版本4.0.0,同理项目中也应与此保持一致;
定义了中央仓库,插件仓库,maven目录结构
十一、dependency依赖中scope范围
1、compile
默认编译依赖范围。对于编译,测试,运行三种classpath都有效
2、test
测试依赖范围。只对于测试classpath有效,只对测试代码有效
3、provided
已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api,打包的时候这个包不会打进去
4、runtime
运行时提供。例如:jdbc驱动
Compile、runtime打包会打进去,test、provided打包不会打进去
5、传递性依赖原则
1.路径最近者优先 CBA,C依赖B,B依赖A,会先用B的jar包
例:C的pom.xml依赖B,B的pom.xml依赖A
B中junit-4.10,A中junit-4.11,就近原则,C中引用junit-4.11
2.路径相同,第一声明者优先:CB,CA,必须看B,A在C中哪一个先声明
例: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
同一个工程中的模块可以相互依赖,idea中是project的概念,如果通过maven依赖,需要先在本project中查找,而后在本地仓库,镜像,中央仓库查找,
1.如果是本地2个不同的project,则需要通过mvn install,上传至本地仓库
2.在1个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>