什么是Maven
- 项目的自动构建,帮助开发人员做项目代码的编译,测试, 打包,安装,部署等工作。
- 管理依赖(管理项目中使用的各种jar包)。
如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综复杂,一个Jar包往往又会引用其他Jar包,缺少任何一个Jar包都会导致项目编译失败。
以往开发项目时,程序员往往需要花较多的精力在引用Jar包搭建项目环境上,而这一项工作尤为艰难,少一个Jar包、多一个Jar包往往会报一些让人摸不着头脑的异常。
而Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。
Maven获取与安装
下载Maven
在 【Maven官方地址】中下载Maven
安装Maven
- 确定JAVA_HOME 指定jdk的安装目录, 如果没有JAVA_HOME, 需要在windows的环境变量中创建JAVA_HOME, 它的值是jdk的安装目录
- 解压缩下载的Maven压缩包 ,把解压后的文件放到一个目录中。 目录的路径不要有中文,不要有空格。
- 把maven安装目录下的bin的路径添加到环境变量Path中
- 测试maven的安装。 在命令行 win+r cmd 中执行
mvn -v
Maven约定的目录结构
maven项目使用的大多人 遵循的目录结构。 叫做约定的目录结构。
一个maven项目是一个文件夹。 比如项目叫做HelloMaven
HelloMaven 项目文件夹
\src
\main 叫做主程序目录(完成项目功能的代码和配置文件)
\java 源代码(包和相关的类定义)
\resources 配置文件
\test 放置测试程序代码的(开发人员自己写的测试代码)
\java 测试代码的(junit)
\resources 测试程序需要的配置文件
\pom.xml maven的配置文件, 核心文件
maven的使用方式:
- maven可以独立使用: 创建项目,编译代码,测试程序,打包,部署等等
- maven和idea一起使用:通过idea借助maven,实现编码,测试,打包等等
pom.xml
POM: Project Object Model 项目对象模型, maven把项目当做模型处理。 操作这个模型就是操作项目。
maven通过pom.xml文件实现 项目的构建和依赖的管理。 ```xml <?xml version=”1.0” encoding=”UTF-8”?>
<!-- pom模型的版本, 就是4.0.0 -->
<modelVersion>4.0.0</modelVersion>
<!-- 坐标 -->
<groupId>com.bjpowernode</groupId>
<artifactId>ch01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<a name="IaP8v"></a>
# 坐标
坐标组成是 `<groupId>`, `<artifactId>`, `<version>`。 <br />坐标作用:确定资源的,是资源的唯一标识。 在maven中,每个资源都是坐标。 坐标值是唯一的。简称叫`gav`
```xml
<groupId>com.abcdefg</groupId>
<artifactId>ch01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
- groupId:组织名称,代码。 公司,团体或者单位的标识。 这个值常使用的公司域名的倒写。 如果项目规模比较大, 也可以是 域名倒写+大项目名称。例如:百度的阿波罗无人车项目 com.baidu.appollo
- artifactId:项目名称, 如果groupId中有项目, 此时当前的值就是子项目名。 项目名称是唯一的。
- version:版本, 项目的版本号, 使用的数字。 三位组成。 例如 主版本号.次版本号.小版本号, 例如: 5.2.5。注意:版本号中有-SNAPSHOT, 表示快照,不是稳定的版本。
- packaging:项目打包的类型, 有jar ,war, ear, pom等等,不写默认是jar
项目使用gav:
- 每个maven项目,都需要有一个自己的gav
- 管理依赖,需要使用其他的jar ,也需要使用gav作为标识。
搜索坐标的地址: https://mvnrepository.com/
依赖dependency
依赖:项目中要使用的其他资源(jar),比如需要使用mysql数据库,就要使用mysql的驱动。
可以用maven管理依赖。
需要在pom.xml文件中,使用dependencies 和dependency, 还有gav 完成依赖的说明。
注:
一个pom.xml
文件在project
节点下声明一个dependencies
节点,然后再dependencies节点里面可以声明多个dependency
节点,每个dependency节点下面就是你要引用的jar依赖的gav
坐标。
maven使用gav作为标识,从互联网下载依赖的jar。 下载到你的本机上。 由maven管理项目使用的这些jar
<dependencies>
<!-- 日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.16</version>
</dependency>
</dependencies>
依赖范围
依赖范围:使用
依赖范围表示: 这个依赖(jar和里面类)在项目构建的那个阶段起作用。
依赖范围
- compile:默认, 参与构建项目的所有阶段
- test:测试,在测试阶段使用, 比如执行mvn test会使用junit 。
- provided:提供者。 项目在部署到服务器时,不需要提供这个依赖的jar , 而是由服务器这个依赖的jar包。明显的是servlet 和jsp 依赖
仓库
仓库是存东西的,maven的仓库存放的是:
- maven工具自己的jar包。
- 第三方的其他jar, 比如项目中要使用mysql驱动。
-
仓库分类
本地仓库
默认路径,是你登录操作系统的账号的目录中/.m2/repository
修改本地仓库的位置
修改maven工具的配置文件(maven的安装路径\conf\setting.xml)
步骤: 创建一个目录,作为仓库使用。 目录不要有中文和空格。 目录不要太深。 例如: C:/maven/repository
- 修改setting.xml文件,
<localRepository>C:/maven/repository</localRepository>
,localRepository是settings标签的直接子标签 -
远程仓库
中央仓库: 一个ftp服务器, 存放了所有的资源。
- 中央仓库的镜像: 就是中央仓库的拷贝。 在各大主要城市都有镜像。
- 私服:在局域网中使用的。 私服就是自己的仓库服务器。 在公司内部使用的
maven使用仓库: maven自动使用仓库, 当项目启动后, 执行了maven的命令, maven首先访问的是本地仓库, 从仓库中获取所需的jar, 如果本地仓库没有 ,需要访问私服或者中央仓库或者镜像。
镜像仓库
中央仓库下载慢,可以添加国内的镜像仓库
添加阿里云镜像,把这段标签,放在Maven的setting.xml文件的mirrors标签下面
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
maven的生命周期
maven的生命周期: 项目构建的各个阶段。 包括:
- 清理
- 编译
- 测试
- 报告
- 打包
- 安装
-
命令与插件
maven项目根目录,pom.xml同级目录下打开命令行,可以输入下面的命令
mvn clean
清理命令, 作用删除以前生成的数据, 删除target目录。
使用的插件:-
mvn compile
编译命令,执行的代码编译, 把src/main/java目录中的java代码编译为class文件
同时把class文件拷贝到 target/classes目录。 这个目录classes是存放类文件的根目录(也叫做类路径,classpath)
使用的插件: maven-compiler-plugin:编译代码的插件
maven-resources-plugin:资源插件, 处理文件的。 作用是把src/main/resources目录中的文件拷贝target/classes目录中
mvn test-compile
编译命令, 编译src/test/java目录中的源文件, 把生成的class拷贝到target/test-classes目录。同时把src/test/resources目录中的文件拷贝到 test-clasess目录
使用的插件:maven-compiler-plugin:编译代码的插件
- maven-resources-plugin资源插件, 处理文件的
-
mvn test
测试命令, 作用执行 test-classes目录的程序, 测试src/main/java目录中的主程序代码是否符合要求
使用的插件:
-
mvn package
打包,作用是把项目中的资源class文件和配置文件都放到一个压缩文件中, 默认压缩文件是jar类型的。 web应用是war类型, 扩展是jar,war的
使用的插件: maven-jar-plugin:执行打包处理。 生成一个jar扩展的文件, 放在target目录下。打包的文件包含的是 src/main目录中的所有的生成的class和配置文件和test无关
mvn install
把生成的打包的文件 ,安装到maven仓库
使用的插件:-
自定义配置插件
在pom.xml文件中, build标签中。设置插件
<!-- 设置构建项目相关的内容 -->
<build>
<plugins>
<!-- 设置插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source> <!-- 指定编译代码的jdk版本 -->
<target>1.8</target> <!-- 运行java程序使用的jdk版本-->
</configuration>
</plugin>
</plugins>
</build>
常用设置
properties基础设置
<properties>
<maven.compiler.source>1.8</maven.compiler.source> 源码编译 jdk 版本
<maven.compiler.target>1.8</maven.compiler.target> 运行代码的 jdk 版本
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 项目构建使用的编码,避免中文乱码
<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>
依赖使用全局变量,语法 ${变量名} ```xml
org.springframework spring-core ${spring.version}
<a name="EjesZ"></a>
# 使用资源插件
处理的配置文件的信息, maven默认处理配置文件<br />①:maven会把src/main/resources目录中的文件, 拷贝到target/classes目录下<br />②:maven只处理src/main/java目录中的 .java文件,把这些java文件编译为class,拷贝到 target/classes目录中。 不处理其他文件。
```xml
<build>
<!--资源插件
告诉maven把 src/main/java目录中的 指定扩展名的文件 拷贝到 target/classes目录中。
-->
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes>
<!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!-- filtering 选项 false 不启用过滤器, *.property 已经起到过
滤的作用了 -->
<filtering>false</filtering>
</resource>
</resources>
</build>
Maven和IDEA的集成
在IDEA中设置Maven环境
idea中有一个自带的maven。 我们要让idea使用自己安装的maven
设置项: -DarchetypeCatalog=internal
对新建的项目或者导入的项目也使用同样的maven设置,进去同样的设置
创建基于Maven的普通java项目
创建完成
创建完成后结构如下
第一次创建要下载很多东西,速度真的慢,创建了半个小时。不过第一次下载的东西都放在本地仓库了,之后创建就不需要下载这么多了。
如果要加上resources目录结构,可以直接新建文件夹右键该文件夹
报错
应该是Maven版本问题,之前用的是最新版本,3.8.5,才出几天的版本,换个低版本的,3.8.1去年版本,就好了
单元测试junit
junit是一个单元测试的工具, 在java中经常使用。
- 单元:在java中指的是方法。 一个方法就是一个单元, 方法是测试的最小单位。
- 作用:使用junit去测试方法是否完成了要求。 开发人员自测。
明白了一点,以前一直觉得要测试一段代码有没有问题,运行代码,断点调试就行了。根本没必要用单元测试。 后来写API,有些底层的方法需要测试,我需要一层一层调用好了,然后传参数进去。挺麻烦的,如果能直接调用底层的方法就好了,这就是单元测试,直接运行目标方法
使用单元测试
加入junit依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
在src/test/java 目录中创建测试类文件,写测试代码
单元测试使用的建议:
- 测试类的定义, 名称一般是Test+要测试的类名称
- 测试类它的包名和要测试的类包名一样
- 在类中定义方法,要测试代码