Maven 是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需做一些简单的配置,就可以批量完成项目的构建、报告和文档的生成工作。Maven 是跨平台的,这意味着无论是在 Windows 上,还是在 Linux 或者 Mac 上,都可以使用同样的命令。
Maven的功能如下:
- Maven 统一集中管理好所有的依赖包,不需要程序员再去寻找。
- 对应第三方组件用到的共同 jar,Maven 自动解决重复和冲突问题。
- Maven 作为一个开放的架构,提供了公共接口,方便同第三方插件集成。程序员可以将自己需要的插件,动态地集成到 Maven,从而扩展新的管理功能。
- Maven 可以统一每个项目的构建过程,实现不同项目的兼容性管理。
Maven支持的构建包括:
- 清理, 把之前项目编译的东西删除掉,为新的编译代码做准备。
- 编译, 把程序源代码编译为执行代码, java-class文件批量的,maven可以同时把成千上百的文件编译为class。javac 不一样,javac一次编译一个文件。
- 测试, maven可以执行测试程序代码,验证功能是否正确。批量的,maven同时执行多个测试代码,同时测试很多功能。
- 报告, 生成测试结果的文件, 测试是否通过。
- 打包, 把项目中所有的class文件,配置文件等所有资源放到一个压缩文件中。这个压缩文件就是项目的结果文件, 通常java程序,压缩文件扩展名是.jar。对于web应用,压缩文件扩展名是.war
- 安装, 把5中生成的文件jar,war安装到本机仓库
- 部署, 把程序安装好可以执行。
maven核心概念:
- POM : 一个文件 名称是pom.xml , pom翻译过来叫做项目对象模型。maven把一个项目当做一个模型使用。控制maven构建项目的过程,管理jar依赖。
- 约定的目录结构 : maven项目的目录和文件的位置都是规定的。
- 坐标 : 是一个唯一的字符串,用来表示资源的。
- 依赖管理 : 管理你的项目可以使用jar文件
- 仓库管理(了解) :你的资源存放的位置
- 生命周期 (了解) : maven工具构建项目的过程,就是生命周期。
- 插件和目标(了解):执行maven构建的时候用的工具是插件
- 继承
- 聚合
maven约定的目录结构, 约定是大家都遵循的一个规则。
每一个maven项目在磁盘中都是一个文件夹(项目-Hello)
Hello/
---/src
------/main #放你主程序java代码和配置文件
----------/java #你的程序包和包中的java文件
----------/resources #你的java程序中要使用的配置文件
------/test #放测试程序代码和文件的(可以没有)
----------/java #测试程序包和包中的java文件
----------/resources #测试java程序中要使用的配置文件
---/pom.xml #maven的核心文件(maven项目必须有)
pom:
项目对象模型,是一个pom.xml文件
1坐标:
唯一值, 在互联网中唯一标识一个项目的
<groupId>公司域名的倒写</groupId>
<artifactId>自定义项目名称</artifactId>
<version>自定版本号</version>
https://mvnrepository.com/ 搜索使用的中央仓库, 使用groupId 或者 artifactId作为搜索条件
2.packaging:
打包后压缩文件的扩展名,默认是jar ,web应用是war。packaging 可以不写, 默认是jar
3.依赖:
dependencies 和dependency ,相当于是 java代码中import
项目中要使用的各种资源说明,例:
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
</dependencies>
4.properties:
设置属性
5.build:
maven在进行项目的构建时, 配置信息,例如指定编译java代码使用的jdk的版本等。
maven生命周期:
maven的生命周期就是maven构建项目的过程,清理,编译,测试,报告,打包,安装,部署。
modelVersion | Maven 模型的版本,对于 Maven2 和 Maven3 来说,它只能是 4.0.0 | |
groupId | 组织 id,一般是公司域名的倒写。 格式可以为: 1. 域名倒写。 例如 com.baidu 2. 域名倒写+项目名。例如 com.baidu.appolo | groupId 、artifactId 、version 三个元素 |
artifactId | 项目名称,也是模块名称,对应 groupId 中 项目中的子项目。 | 生 成 了 一 个Maven 项目的基本坐标,在众多的maven 项目中可以唯一定位到某一个项目。坐标也决定着将来项目在仓库 中 的 路 径 及 名称。 |
version | 项目的版本号。如果项目还在开发中,是不稳定版本,通常在版本后带-SNAPSHOTversion 使用三位数字标识,例如 1.1.0 | |
packaging | 项目打包的类型,可以使 jar、 war、 rar、 ear、 pom,默认是 jar |
依赖: dependencies 和 dependency | Maven 的一个重要作用就是管理 jar 包,为了一个项目可以构建或运行,项目中不可避免的,会依赖很多其他的 jar 包,在 Maven 中,这些 jar 就被称为依赖,使用标签 dependency 来配置。 而这种依赖的配置正是通过坐标来定位的,由此我们也不难看出, maven 把所有的 jar 包也都视为项目存在了。 |
配置属性: properties | properties 是 用 来 定 义 一 些 配 置 属 性 的 , 例 如project.build.sourceEncoding(项目构建源码编码方式),可以设置为UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级。 |
构建: build | build 表示与构建相关的配置, 例如设置编译插件的 jdk 版本 |
继承: parent | 在 Maven 中,如果多个模块都需要声明相同的配置,例如: groupId、version、 有相同的依赖、或者相同的组件配置等, 也有类似 Java 的继承机制, 用 parent 声明要继承的父工程的 pom 配置。 |
聚合: modules | 在 Maven 的多模块开发中,为了统一构建整个项目的所有模块,可以提供一个额外的模块,该模块打包方式为 pom,并且在其中使用 modules 聚合的其它模块,这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有模块,叫 Maven 的聚合。 |
单元测试(测试方法):
用的是JUnit, JUnit是一个专门测试的框架(工具)。JUnit测试的内容: 测试的是类中的方法, 每一个方法都是独立测试的。方法是测试的基本单位(单元)。
maven借助单元测试,批量的测试你类中的大量方法是否符合预期的。
使用步骤:
1.加入依赖,在pom.xml加入单元测试依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
2.在maven项目中的src/test/java目录下,创建测试程序。
推荐的创建类和方法的提示:
1.测试类的名称 是Test + 你要测试的类名
2.测试的方法名称 是:Test + 方法名称
例如你要测试HelloMaven ,
创建测试类 TestHelloMaven
@Test
public void testAdd(){
测试HelloMaven的add方法是否正确
}
其中testAdd叫做测试方法,它的定义规则
1.方法是public的,必须的
2.方法没有返回值,必须的
3.方法名称是自定义的,推荐是Test + 方法名称
4.在方法的上面加入 @Test
3)mvn compile
编译main/java/目录下的java 为class文件, 同时把class拷贝到 target/classes目录下面
把main/resources目录下的所有文件 都拷贝到target/classes目录下
IDEA中使用
idea中内置了maven ,一般不使用内置的, 因为用内置修改maven的设置不方便。使用自己安装的maven, 需要覆盖idea中的默认的设置。让idea指定maven安装位置等信息
使用模版创建项目
1)maven-archetype-quickstart : 普通的java项目
2)maven-archetype-webapp : web工程
Maven依赖范围
使用scope表示。scope的值有 compile, test, provided ,默认是compile。表示依赖使用的范围,也就是在maven构建项目的那些阶段中起作用。
compile:编译依赖范围(默认),使用此依赖范围对于编译、测试、运行三种 classpath 都有效,即在编译、测试和运行的时候都要使用该依赖jar包;
test:测试依赖范围,从字面意思就可以知道此依赖范围只能用于测试classpath,而在编译和运行项目时无法使用此类依赖,典型的是JUnit,它只用于编译测试代码和运行测试代码的时候才需要;
provided:此依赖范围,对于编译和测试classpath有效,而对运行时无效;
runtime:运行时依赖范围,对于测试和运行classpath有效,但是在编译主代码时无效,典型的就是JDBC驱动实现;
system:系统依赖范围,使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径,不依赖Maven仓库解析,所以可能会造成建构的不可移植,谨慎使用。