是什么?Maven 是一个项目管理工具
传统的项目开发(没有使用maven)存在的问题
使用maven的优点
构建:项目的构建。
构建是面向过程的,就是一些步骤,完成项目代码的编译,测试,运行,打包,部署等等。
maven支持的构建包括有:
清理,把之前项目编译的东西删除掉,为新的编译代码做准备。
编译,把程序源代码编译为执行代码,java-class文件批量的,maven可以同时把成千上百的文件编译为class。javac不一样,javac一次编译一个文件。
测试,maven可以执行测试程序代码,验证你的功能是否正确。批量的,maven同时执行多个测试代码,同时测试很多功能。
报告,生成测试结果的文件,测试通过没有。
打包,把你的项目中所有的class文件,配置文件等所有资源放到一个压缩文件中。这个压缩文件就是项目的结果文件,通常java程序,压缩文件是jar扩展名的。对于web应用,压缩文件扩展名是.war
安装,把5中生成的文件war,war安装到本机仓库
部著,把程序安装好可以执行。// 这个用maven比较麻烦,通常手工完成
核心概念:
maven的安装和配置
下载:直接官网上下载(10M)就行
子目录介绍:
配置:
在系统的环境变量中的指定一个M2_HOME的名称,指向maven主目录
然后在path中加入bin目录
出现如下内容说明安装配置正确
每一个maven的项目在磁盘中都是一个文件夹

在main\java中创建了一个package,里面写上测试代码
使用命令行 mvn compile 编译main\java中的所有java程序
此时会发现正在下载大量的东西,问题:为什么要下载这些东西?下载了什么?下载完成之后这些东西存到哪里了?
为什么要下载?因为maven工具的执行需要用到很多的插件(java类–jar文件)
下载什么?jar文件,插件。用来完成某些功能
下载到哪里了?默认放在C盘 \ 用户 \ .m2 \ respository(本机仓库)
执行了mvn compile之后,在项目的根目录下面生成了target目录,编译生成的所有文件都在里面。
设置本机的存放资源的目录位置:

把这个标签移动到注释外面,并为其指定一个目录,注意整个路径中不要有中文(注意斜杠的方向)
1)仓库是什么:仓库是存放东西的,存放mavon使用的jar和我们项目使用的jar,maven使用的插件(各种)jar)
2)仓库的分类
3)仓库的使用,maven仓库的使用不需要人为参与。开发人员需要使用mysql驱动——>maven首先查本地仓库——>私服——>镜像——>中央仓库
Project Object Model 项目对象模型。Maven把一个项目的结构和内容抽象为一个模型,在xml文件中进行声明以方便进行构建和描述。
pom.xml是Maven的灵魂。maven环境搭建好之后,所有的学习和操作都是关于pom.xml的
基本信息:
modelVersion
坐标(gav)
groupId
组织id, 一般式公司域名的倒写, 格式可以为
域名倒写. 例如 com.baidu
域名倒写+项目名 如 com.baidu.baidusearch
项目名称(模块名称)
version
-SNAPSHOT1.1.0<groupId><artifactId><version> 三个构成了Maven项目的坐标,坐标是唯一的,也决定着将来项目在仓库中的路径及名称
packaging
dependencies和dependency(依赖)
Maven的一个重要作用就是管理jar包,为了一个项目可以构建或运行,项目中不可避免的,会依赖很多其他的jar包,在Maven中,这些jar就被称为依赖,使用标签dependency来配置。而这种依赖的配置正是通过坐标来定位的,由此我们也不难看出,maven把所有的jar包也都视为项目存在了。
如何配置该属性?

使用的时候,maven如何查找项目所需要的jar包?
mysql/mysql-connector-java/5.1.46 目录,在其中寻找jar包properties(属性)
properties是用来定义一些配置属性的,例如project.build.sourceEncoding(项目构建源码编码方式),可以设置为UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级。
以下作为了解
build
表示与构建相关的配置,例如设置编译插件的jdk版本
在Maven中,如果多个模块都需要声明相同的配置,例如:groupId、version、有相同的依赖、或者相同的组件配置等,也有类似Java的继承机制,用parent声明要继承的父工程的pom配置。
modules
在Maven的多模块开发中,为了统一构建整个项目的所有模块,可以提供一个额外的模块,该模块打包方式为pom,并且在其中使用modules聚合的其它模块,这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有模块,叫Maven的聚合。
Maven的生命周期指的是用maven进行项目构建的过程,清理、编译、测试、报告、打包、安装、部署等过程
maven的命令:maven独立使用,通过命令完成maven的生命周期的执行,可以通过使用命令进行项目的清理, 编译,测试等
| 命令 | 作用 |
|---|---|
| mvn clean | 清理(会删除原来编译和测试的目录,即target目录,但是已经install到仓库里的包不会删除)(由插件完成真正的清理工作) |
| mvn compile | 编译主程序(mian目录下的)(会在当前目录下生成一个target,里边存放编译主程序之后生成的字节码文件) 编译main/java目录下的java为class文件,同时把class拷贝到target/classes目录下面。把main/resources目录下的文件都拷贝到target/classes下面 |
| mvn test-compile | 编译测试程序(test目录下的)(会在当前目录下生成一个target,里边存放编译测试程序之后生成的字节码文件) |
| mvn test | 测试(会生成一个目录surefire-reports,保存测试结果)当我们执行测试的时候,会自动执行一遍前面的所有命令(clean,compile,test-complile) |
| mvn package | 打包主程序(会编译、编译测试、测试、并且按照pom.xml配置把主程序打包生成jar包或者war包) 打包生成的jar中只有src/main中的所有内容,在打包的时候,坐标中的每一个属性都是一个文件夹,groupId中的一个‘.’ 也对应着一个文件夹 |
| mvn install | 安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库中,这样其他的项目就能使用这个jar包了,也会把以前的所有命令执行一遍) |
| mvn deploy | 部署主程序(会把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。还会自动把项目部署到web容器中)。 |
在实际开发中用的mvn install比较多
测试方法:用的是junit,junit是一个专门测试的框架(工具)。
junit测试的内容:测试的是类中的方法,每一个方法都是独立测试的。方法是测试的基本单位(单元)。
maven借助单元测试,批量的测试你类中的大量方法是否符合预期的。
如何进行单元测试?
在maven项目中的src/test/java目录下创建测试程序。推荐的创建类和方法的提示:
测试类的名称是Test + 你要测试的类名
测试的方法名是 Test + 方法名称
例:比如我要测试Hello,我就要创建测试类TestHello,然后在类中编写测试方法TestHello
IDEA中内置了一个maven,但是我们一般不用内置的,不方便修改。
使用自己安装的maven,需要覆盖IDEA中的默认设置,让他知道指定的maven的配置信息。
需要在两个地方进行设置,一个是settings(当前工程的设置),另一个是Other settings(以后新建的工程的设置,在settings界面中)
配置阿里云镜像
打开 Maven 的配置文件(windows机器一般在maven安装目录的conf/settings.xml),在**<mirrors></mirrors>**标签中添加 mirror 子节点:
1 | <mirror> |
新建空项目
新建基于maven的module
点击完成
使用这个模板创建的web—maven项目缺少一些文件,需要自己手动加上
添加上这三个文件,构建成了一个基本的web项目。
如果要做一个servlet-jsp-web软件还要进行以下操作:
在依赖中添加上servlet和jsp的依赖
1 | <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> |
1 | <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api --> |
【maven-p24后半部分有一段创建servlet项目,配置tomcat服务器,这个学了web之后再看看】
【小技巧】
当我们在pom.xml中粘贴进了一段dependency之后,可能会划红线,此时IDEA还不认识这些字,我们需要刷新一下maven:

还可以从侧边的maven框中刷新,区别是在右边的框中刷新的时候会刷新所有的项目,左边右键pom文件只能一个项目一个项目地刷新。
依赖范围,使用scope表示
scope的值有 compile,test,provided scope:表示依赖使用的范围,也就是在maven构建项目的那些阶段中起作用。maven构建项目清理,(编译)测试),打包,安装,部署过程(阶段)
写依赖的时候怎么知道是哪个版本?
1 | <properties> |
自定义属性:
自定义全局变量一般是定义依赖的版本号,当你的项目中要使用多个相同的版本号的时候,可以先使用全局变量进行定义。
1 | <build> |
作用:在mybatis中会用到这个作用
<build>中加入上述<resources>.