一、Maven是什么?
maven翻译为“专家”,是Apache下的一个纯Java开源项目,基于项目对象模型的概念,去管理项目的构件、报告和文档。也可以用于构建其他语言的项目。如C#。
二、Maven能干什么(Java中主要用途)?
1.清理项目, 命令(maven clean)
2.编译项目, 命令(mvn compile)
3.测试项目, 命令(mvn test)
4.生成测试报告
5.打包项目,命令(mvn package)
6.部署项目,命令(mvn deploy)
二、Maven项目结构
|---src
|---main
|---java (存放项目 的 .java 文件)
|---resources (存放项目资源文件,如 Spring配置文件)
|---test
|---java (存放所有测试的 .java 文件 ,如 Junit测试类)
|---resources(存放项目测试资源文件,如 config.properties 配置资源)
|---target (项目输出位置)
|---pom.xml (标识该项目是一个Maven项目)
三、手动创建Maven项目
pom.xml文件的配置
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!--所有的Maven项目都必须配置这四个配置项-->
<modelVersion>4.0.0</modelVersion>
<!--groupId指的是项目名的项目组,默认为包名-->
<groupId>com.xxx.xxx</groupId>
<!--artifactId指项目中某一个模块,默认命名方式是"项目名-模块名"-->
<artifactId>mavenProjeck</artifactId>
<!--version指的是版本,这里使用的是Maven的快照版本-->
<version>SNAPSHOT-0.0.1</version>
<!--此处开始配置依赖注入-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>compile/test/provided/runtime</scope>
</dependency>
</dependencies>
</project>
四、Maven仓库布局
1、本地仓库
默认情况下,不管是在windows还是linux上,每个用户在自己的用户目录下都有一个路径名为.m2/repository/的仓库目录。有时候,因为某些原因(例如C盘空间不够),用户会想要自定义本地仓库目录地址。这时,可以编辑文件~/.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的下载请求提供服务。此外,一些无法从外部仓库下载到的构件也能从本地上传到私服上供大家使用。
5、Maven坐标 (用来唯一标识一个构件,在依赖里面根据坐标来找需要的构件)
groupId:定义maven的项目,可以用包名
artifactId:定义项目中的一个模块,一般都是工程名
version:版本
packaging:定义打包方式
五、dependency依赖中scope范围
1、compile :默认编译依赖范围。对于编译,测试,运行三种classpath都有效
2、test :测试依赖范围。只对于测试classpath有效,只对测试代码有效
3、provided: 已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api,打包的时候这个包不会打进去
4、runtime:运行时提供。例如:jdbc驱动 Compile、runtime打包会打进去,test、provided打包不会打进去
六、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.跳过测试
mvn package -DskipTests
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
mvn package -Dmaven.test.skip=true 跳过测试代码的编译
3、动态指定要运行的测试用例
maven-surefire-plugin提供了一个test参数让Maven用户能够在命令行指定要运行的测试用例。
如: mvn test -Dtest=RandomGeneratorTest
也可以使用通配符: mvn test -Dtest=Random*Test
或者也可以使用“,”号指定多个测试类: mvn test -Dtest=Random*Test,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、生成测试报告
默认情况下,maven-surefire-plugin会在项目的target/surefire-reports目录下生成两种格式的错误报告。
简单文本格式:内容十分简单,可以看出哪个测试项出错。
与JUnit兼容的XML格式:XML格式已经成为了Java单元测试报告的事实标准,这个文件可以用其他的工具如IDE来查看。